使用.iteritems()迭代Python字典中的键值

时间:2015-05-13 18:54:37

标签: python python-2.7 dictionary

注意:我有read this post and Alex Martelli's response,但我并不完全/完全理解他的回答。这有点超出了我目前的理解。我想帮助更好地理解它。

我理解当您尝试以下for循环时:

for key, value in dict:
    print key
    print value 

你得到:

ValueError: too many values to unpack

虽然您可以遍历字典并只使用以下内容获取密钥:

for key in dict:
    print key 

任何人都可以提供一个稍微不那么高级的解释,说明为什么不使用密钥值而不使用.iteritems()来迭代字典?

4 个答案:

答案 0 :(得分:10)

另一个答案解释得很好。但是这里有一些关于它如何表现的进一步说明,通过展示它实际上没有错误的情况(所以你可以看到一些东西):

>>> d = {(1,2): 3, (4,5): 6}
>>> for k, v in d:
        print k, v

1 2
4 5

循环遍历键(1,2)(4,5),因为那些"碰巧是"大小为2的元组,可以将它们分配到kv

也可以使用字符串,只要它们只有两个字符:

>>> d = {"AB":3, "CD":6}
>>> for k, v in d:
        print k, v

A B
C D

我假设你的情况是这样的?

>>> d = {"ABC":3, "CD":6}
>>> for k, v in d:
        print k, v

Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    for k, v in d:
ValueError: too many values to unpack

这里,关键&#34; ABC&#34;是一个三元组,因此Python抱怨尝试将其解压缩为两个变量。

答案 1 :(得分:7)

Python有一个名为iterable unpacking的功能。当你这样做

a, b = thing

Python假设thing是一个元组或列表或包含2个项目的内容,它会将第一个和第二个项目分配给ab。这也适用于for循环:

for a, b in thing:

相当于

for c in thing:
    a, b = c

除了它没有创建c变量。

这意味着如果你这样做

for k, v in d:

Python无法查看您已经说过k, v而不是k的事实,而是为您提供项目而不是密钥,因为密钥可能是2元组。它必须迭代密钥并尝试将每个密钥解压缩到kv变量中。

答案 2 :(得分:0)

使用for xx in XX时,实际上是使用迭代器来迭代XX,而XX必须是可迭代的。您可以使用iter函数来获取迭代器,如

>>> d = dict(a=1,b=2)
>>> i = iter(d)
>>> i
<dictionary-keyiterator object at 0x6ffff8739f0>

并使用next访问元素。

>>> next(i)
'a'

因此,在for k in d的每次迭代中,k都会被分配给next(i),而它只是没有值的密钥。例如,在第一轮迭代中,

k = 'a'

虽然.iteritems()将返回另一个迭代器,但可以获得组合键值的元组。我们来看看

>>> i = d.iteritems()
>>> i
<dictionary-itemiterator object at 0x6ffff873998>
>>> next(i)
('a', 1)

请参阅?在for k, v in d.iteritems()的第一轮中,我们实际上得到了这个作业

k, v = ('a', 1)

因此,如果您使用for k, v in d,您将获得

k, v = 'a'

这是非法转让。

答案 3 :(得分:0)

在Python 2.7.6中,您可能希望使用dict.has_key(property_name)检查字典的子属性。