Pythonic的方法是从dict理解中创建字典,+其他东西

时间:2010-10-12 18:58:18

标签: python dictionary

我想做这样的事情:

parsetable = {
              # ...

              declarations: {
                             token: 3 for token in [_id, _if, _while, _lbrace, _println]
                             }.update({_variable: 2}),

              #...
             }

但是这不起作用,因为更新不会返回任何内容。除了明确地写完整个字典之外,有没有简单的方法呢?

应该可以使用dict()和元组的列表理解+额外的部分,但这很尴尬。

4 个答案:

答案 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(),因为没有必要使用此类。