Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-字典的迭代列表和解包_Python_Python 3.x_List Comprehension_Argument Unpacking - Fatal编程技术网

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