2012-03-12 105 views
0

閱讀diveintopython3發現這一點,並不能解構成我理解的小比特。這個變量在哪裏定義?

>>> a_dict = {'a': 1, 'b': 2, 'c': 3}       
>>> {value:key for key, value in a_dict.items()}    
>>> {1: 'a', 2: 'b', 3: 'c'} 

a_dict.items()創建一個列表。但值a_dict.items()對我來說沒有意義,因爲價值沒有定義...

這是怎麼回事?

+0

在簡單的英語,你的'for'是說:拔出分配給它的每個'key'和'value'並將其存儲在相應的變量。方便,呃? – rjz 2012-03-12 04:04:59

+0

看着它上面的顏色語法突然點擊..我注意到它只是一個>>>的東西在:東西是兩個變量而不是1的東西。原來我雖然逗號代表東西待辦事項與外{{ 。我不習慣看到內部陳述 – 2012-03-12 04:58:28

+0

你已經明白了! @machine嚮往的答案提供了一些很好的細節澄清:^) – rjz 2012-03-12 05:00:34

回答

4

a_dict.keys()是在你的字典

a_dict.values()的列表是在你的字典列表

a_dict.items()是清單(鍵值)

{value:key for key, value in a_dict.items()}字典()理解這需要a_dict和切換其以其,返回一個新的數據結構作爲結果。如果仔細觀察,可以看到在結果部分有value:key,但在迭代部分我們有key, value - 它們切換!非常棘手,非常pythonic。

如果a_dict中沒有重複的值,則會導致原始字典的反轉。如果有重複,由於新詞典中的所有鍵都必須是唯一的,因此每個重複值的映射只能有一個存活。

>>> a_dict = {'a': 1, 'b': 2, 'c': 3} 
>>> b_dict = {value:key for key, value in a_dict.items()} 

>>> a_dict.items() 
[('a', 1), ('c', 3), ('b', 2)] 
>>> b_dict.items() 
[(1, 'a'), (2, 'b'), (3, 'c')] 

>>> a_dict.keys() 
['a', 'c', 'b'] 
>>> b_dict.values() 
['a', 'b', 'c'] 

>>> a_dict.values() 
[1, 3, 2] 
>>> b_dict.keys() 
[1, 2, 3] 

# Try one with duplicates! 
>>> c_dict = {'a': 1, 'b': 2, 'c': 3, 'd':2} 
>>> d_dict = {value:key for key, value in c_dict.items()} 

# The number 2 can only map to one value; 
# the constructor seems to have encountered 'd' last 
>>> c_dict.items() 
[('a', 1), ('c', 3), ('b', 2), ('d', 2)] 
>>> d_dict.items() 
[(1, 'a'), (2, 'd'), (3, 'c')] 

這裏有一個字典()理解如果您遇到困難,瞭解他們是如何工作的一個簡單的例子;將它輸入到交互式編輯器中,然後解決它!

>>> e_dict = {n: str(n) * n for n in range(1, 30)} 
1

值清楚地定義如下:

'a':1 

這意味着索引「A」具有爲1的值,等等,等等。

第二行剛剛創建了一個使用值作爲鍵和鍵作爲第一個字典值的字典。

+0

顯然是一個相對的術語... – 2012-03-12 04:50:17

+0

我沒有使用術語「明確」來冒犯任何人或任何東西。我使用它是因爲它明確定義,沒有函數,表達式等,與模糊定義相反,這意味着它是通過函數或表達式生成的。 – DanRedux 2012-03-12 04:52:33

1

value和key只是字典實際內容的佔位符。這基本上意味着對於字典中的每個鍵:值對,值部分將被分配給值並且鍵部分被鍵入。

內容的價值和重點:

iteration value  key 
    1   1  'a' 
    2   2  'b' 
    3   3  'c' 
1

這條線:

{value:key for key, value in a_dict.items()}

之所以稱之爲字典解析,這是類同列出內涵。 PEP 274爲您提供了有關此語法的更多詳細信息。

該表達式擴展爲:

temp_dict = dict() 
for key, value in a_dict.items(): 
    temp_dict[value] = key 
print temp_dict 
+0

爲PEP +1! :) – 2012-03-12 05:06:26