python - 迭代字典列表和解包

jak*_*e77 13 python list-comprehension argument-unpacking python-3.x

给出一个简单的词典列表

lst = [{'key1': 1}, {'key2': 2}, {'key3': 3}]
Run Code Online (Sandbox Code Playgroud)

我想找到一个dict,它产生使用此处未详述的方法评估的最小值.我的第一个想法是迭代列表以通过dict检查dict,但是这失败了:

for k, v in [x.items() for x in lst]:
    print(k, v)
Run Code Online (Sandbox Code Playgroud)

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

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

然而,

for x in lst:
    for k, v in x.items():
        print(k, v)
Run Code Online (Sandbox Code Playgroud)

产量

key1 1
key2 2
key3 3
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*man 7

你错过了一个迭代级别.

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

如果您打印结果,[x.items() for x in lst]您将看到结果是dict_view项目列表; 其中每一个都可以自己迭代.


Kru*_*pös 5

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

for k, v in [(k, v) for x in lst for (k, v) in x.items()]:
  print(k, v)
Run Code Online (Sandbox Code Playgroud)

屈服

key1 1
key2 2
key3 3
Run Code Online (Sandbox Code Playgroud)

正如预期的那样。