python-迭代字典列表并解包

2024-04-16 18:06:15 发布

您现在位置:Python中文网/ 问答频道 /正文

给出一个简单字典的简单列表

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

我想找到使用这里没有详细说明的方法计算出最小值的dict。 我的第一个想法是迭代列表来逐个检查dict,但这失败了:

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

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

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),但是为什么不使用列表理解呢?有人能启发我吗?

编辑:我使用Python3,我知道items()会生成一个dict_视图,但我不明白为什么逻辑不起作用。


Tags: 方法in列表for字典错误notitems
3条回答

您缺少一个迭代级别。

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

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

尝试一步一步地解压lst,以了解它是如何构造的。

>>> in: lst[0].items()
>>> out: [('key1', 1)]

结果(相当于列表理解中的x.items()表达式)是包含k和v元组的另一个列表。元组是此列表中索引0的元素(也是唯一的元素)。所以你得像

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

您可以在列表理解中添加一级缩进(正如@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

如预期。

相关问题 更多 >