我想做这样的事情:
parsetable = {
# ...
declarations: {
token: 3 for token in [_id, _if, _while, _lbrace, _println]
}.update({_variable: 2}),
#...
}
但是这不起作用,因为更新不会返回任何内容。除了明确地写完整个字典之外,有没有简单的方法呢?
应该可以使用dict()和元组的列表理解+额外的部分,但这很尴尬。
答案 0 :(得分:4)
我认为你提到的使用dict()和元组列表的方法就是我这样做的方法:
dict([(x, 3) for x in [_id, _if, _while, _lbrace, _println]] + [(_variable, 2)])
如果你真的想使用词典理解,你可以这样做:
{ x : 2 if x == _variable else 3
for x in [_id, _if, _while, _lbrace, _println, _variable] }
答案 1 :(得分:1)
然而,只是为了让你知道,如果你想要更新返回的东西,你可以写一个像这样的函数:
import copy
def updated_dict(first_dict, second_dict):
f = copy.deepcopy(first_dict)
f.update(second_dict)
return f
答案 2 :(得分:1)
为了清楚起见,我将其分开,然后申请@Mark Byers关于词典理解的第二个建议:
type2 = [_variable]
type3 = [_id, _if, _while, _lbrace, _println]
parsetable = {
declarations: { token : 2 if token in type2 else 3 for token in type2+type3 }
}
这使事情变得非常清晰并且是可扩展的,同时将相关项目保持在一起以便于查找和/或修改。
答案 3 :(得分:1)
这类似于@Ant所提到的应用于您的样本数据的内容:
def merged_dicts(dict1, *dicts):
for dict_ in dicts:
dict1.update(dict_)
return dict1
parsetable = {
declarations:
merged_dicts(
{ token: 3 for token in [_id, _if, _while, _lbrace, _println] },
{ _variable: 2 }
),
}
我离开了初步copy.deepcopy()
,因为没有必要使用此类。