【问题标题】:Pythonic way to write create dictionary from dict comprehension, + something else从 dict 理解编写字典的 Pythonic 方式,+ 其他东西
【发布时间】:2023-03-21 15:53:01
【问题描述】:

我想做这样的事情:

parsetable = {
              # ...

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

              #...
             }

但这不起作用,因为更新不会返回任何内容。除了显式编写整个 dict 之外,还有什么简单的方法可以做到这一点?

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

【问题讨论】:

  • 为什么不是这两条语句?你为什么打代码高尔夫? parsetable=parsetable[declarations].update() 有什么问题?
  • 完整的可解析字典已经有 70 行长,我想将所有相关数据保存在一个地方,以便于查找或更改。
  • “更容易查找或更改”?一个复杂的陈述如何“更容易查找或更改”?如果您的维护程序员是天才,我想代码高尔夫可能会很好。但对于那些追随你的人来说,似乎更简单更有价值。
  • 我真的不认为它那么复杂。而且我认为将一些数据放在一个地方会很尴尬,而其余数据看似随机地放在 70 行之外。
  • @S.Lott :您应该将您的意见放在答案中,而不是与 cmets 中的 OP 争论。我觉得你“质问”的语气傲慢霸道。您无权要求知道“为什么”它一开始就没有按照您的方式完成。如果您认为它应该是 2 个陈述,那么就将其作为您的答案——不要与问题争论。

标签: python dictionary


【解决方案1】:

我认为您提到的使用 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] }

【讨论】:

  • 感谢您的回复。我认为 dict()/tuple 列表实际上是我想走的路。
【解决方案2】:

然而,只是让你知道,如果你想更新返回一些东西,你可以写一个类似的函数:

import copy
def updated_dict(first_dict, second_dict):
    f = copy.deepcopy(first_dict)
    f.update(second_dict)
    return f

【讨论】:

  • 感谢您的回复,我目前正在使用 dict()/tuple list,但我对您/martineau 的回复非常感兴趣,所以我将不得不继续考虑。
【解决方案3】:

为了清楚起见,我将其拆分,然后应用@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 }
}

这使事情变得非常清晰并且可扩展,同时将相关项目放在一起以方便查找和/或修改。

【讨论】:

    【解决方案4】:

    这类似于@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(),因为这种用法没有必要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 2012-08-27
      • 2019-01-27
      相关资源
      最近更新 更多