python - 迭代字典列表和解包

新手上路,请多包涵

给定一个简单字典的平面列表

lst = [{'key1': 1}, {'key2': 2}, {'key3': 3}]

我想找到使用此处未详述的方法计算得出的最小值的字典。我的第一个想法是迭代列表以逐个字典检查字典,但这失败了:

 for k, v in [x.items() for x in lst]:
    print(k, v)

结果 ValueError(以及使用生成器而不是列表):

 for k, v in [x.items() for x in lst]:
ValueError: not enough values to unpack (expected 2, got 1)

然而,

 for x in lst:
    for k, v in x.items():
        print(k, v)

产量

key1 1
key2 2
key3 3

不出所料。我假设所有方法都按预期工作(除非 PEBKAC),但为什么它不能使用列表理解?有人可以启发我吗?

编辑:我使用 python 3,我知道 items() 会产生一个 dict_view 但我不明白为什么逻辑不起作用。

原文由 jake77 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 523
2 个回答

您缺少一定程度的迭代。

通常,字典有多个键/值对。 dict.items() 将整个字典转换为 (key, value) 形式的元组序列。在您的情况下,每个字典只有一个项目,但 items() 的结果仍然是元组的元组。

如果打印 [x.items() for x in lst] 的结果,您会看到结果是 dict_view 项的列表;其中每一个本身都可以迭代。

原文由 Daniel Roseman 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以在列表理解中添加一级缩进(如@DanielRoseman 建议的那样),而不是采用您的 dict_view 的第一个元素:

 for k, v in [(k, v) for x in lst for (k, v) in x.items()]:
  print(k, v)

屈服

key1 1
key2 2
key3 3

正如预期的那样。

原文由 Kruupös 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题