注意:我有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()
来迭代字典?
答案 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的元组,可以将它们分配到k
和v
。
也可以使用字符串,只要它们只有两个字符:
>>> 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个项目的内容,它会将第一个和第二个项目分配给a
和b
。这也适用于for
循环:
for a, b in thing:
相当于
for c in thing:
a, b = c
除了它没有创建c
变量。
这意味着如果你这样做
for k, v in d:
Python无法查看您已经说过k, v
而不是k
的事实,而是为您提供项目而不是密钥,因为密钥可能是2元组。它必须迭代密钥并尝试将每个密钥解压缩到k
和v
变量中。
答案 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)
检查字典的子属性。