python-字典的迭代列表和解包
给出一个简单字典的简单列表python-字典的迭代列表和解包,python,python-3.x,list-comprehension,argument-unpacking,Python,Python 3.x,List Comprehension,Argument Unpacking,给出一个简单字典的简单列表 lst = [{'key1': 1}, {'key2': 2}, {'key3': 3}] 我想找到使用此处未详细说明的方法计算得出的最小值的dict。 我的第一个想法是迭代列表以逐个检查dict,但这失败了: for k, v in [x.items() for x in lst]: print(k, v) 结果ValueError(以及使用生成器而不是列表): 但是, for x in lst: for k, v in x.items():
lst = [{'key1': 1}, {'key2': 2}, {'key3': 3}]
我想找到使用此处未详细说明的方法计算得出的最小值的dict。
我的第一个想法是迭代列表以逐个检查dict,但这失败了:
for k, v in [x.items() for x in lst]:
print(k, v)
结果ValueError(以及使用生成器而不是列表):
但是,
for x in lst:
for k, v in x.items():
print(k, v)
屈服
key1 1
key2 2
key3 3
正如所料。我假设所有方法都能按预期工作(除非PEBKAC),但为什么不能使用列表理解?有人能启发我吗
编辑:我使用Python3,我知道items()会生成一个dict_视图,但我不明白为什么逻辑不起作用。您缺少一个迭代级别 通常,DICT有多个键/值对
dict.items()
将整个字典转换为元组序列,格式为(键、值)
。在您的例子中,每个字典只有一个项,但是items()
的结果仍然是一个元组的元组
如果您打印lst中x的
[x.items()结果]
您将看到结果是一个dict\u 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)
您可以迭代字典的键、值对,如下所示:-
for k, v in dic.items():
print(k, v)
上面的代码首先将dictionary转换为元组列表,然后在迭代到k,v时逐个解压,如下所示:-
k, v = (k, v) # Tuple unpacking.
现在,在你的例子中,考虑这个代码:-< /P>
z = [x.items() for x in lst]
print(z)
输出为
[dict_items([('key1', 1)]), dict_items([('key2', 2)]), dict_items([('key3', 3)])]
i、 e一个元组列表的列表
因此,让我们将您的代码改写为:-
for k, v in z:
print(k, v)
其中z是元组列表的列表。
在每次迭代中,它从父列表中选取一个列表(仅包含一个元素),然后尝试:-
k, v = [(key, value)] # a list of only one tuple to be unpacked against two variables and hence the failure.
我希望这会有所帮助。您可以在列表理解中添加一级缩进(如@DanielRoseman所建议的),而不是使用
dict_视图的第一个元素:
for k, v in [(k, v) for x in lst for (k, v) in x.items()]:
print(k, v)
屈服
正如所料。如果您解压缩x.items()
它将返回三个列表,其中包含两个元组(键和值)。如果x.items()。在列表中尝试x.items()[0]
!这不起作用,dict_视图不支持索引。list(x.items())[0]是一种方法,但看起来很难看:-/它在我的机器上运行得非常好。当然,我使用的是python 2.7,但是如果您转到3.xRight,这是为数不多的几件会中断的事情之一,这一点对我来说也是很清楚的。我想我想省略@offeltoffel建议的[0],这似乎有点像一个神奇的数字。为了便于阅读,我将使用非压缩版本。在尝试解压lst
时,k和v的每个元组都被包装为另一个列表中的唯一项。列表中唯一元素的索引是什么?这是0
。没有魔法,只有逻辑。我同意可读性比短代码更重要,所以你应该实现你觉得最舒服的东西。
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