2015-05-13 33 views
9

注意:我有read this post and Alex Martelli's response,但我没有真正/完全理解他的答案。这超出了我目前的理解。我希望更好地帮助理解它。使用.iteritems()遍历Python字典中的键值。

我明白,当你尝试循环如下:

for key, value in dict: 
    print key 
    print value 

你:

ValueError: too many values to unpack 

虽然你可以遍历字典和刚拿到钥匙有以下几点:

for key in dict: 
    print key 

任何人都可以提供一个稍低一点的解释为什么你不能迭代o ver使用键的字典,不使用.iteritems()

回答

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 

这里,关键“ABC”是一个三元组,因此Python抱怨试图将它解压缩到两个变量中。

+1

尽管这是正确的,但考虑到问题的上下文,它实际上并不对**有用。 –

+2

我希望**可以通过一些例子来说明行为,特别是那些实际导致接收到的'ValueError'的行为。我正在给我的答案添加更多... –

+0

@DougR。现在怎么样? –

6

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变量中。

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(),我们实际上如果使用for k, v in d得到这个任务

k, v = ('a', 1) 

因此,你会得到

k, v = 'a' 

这是一个非法转让。

0

在Python 2.7.6中,您可能想要检查字典的子属性dict.has_key(property_name)