2015-05-13 38 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)