2012-12-05 183 views
7

我是Python的初學者,但我一直在嘗試這種語法,我無法弄清楚 - 這真是令人困惑。比較兩個詞典鍵值和返回值如果匹配

crucial = {'eggs': '','ham': '','cheese': ''} 
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500} 

if crucial.keys() in dishes.keys(): 
    print dishes[value] 

我想要做的是 - 如果有至關重要的菜餚鍵(在這種情況下,eggs),它將返回2。這似乎很簡單,但我相信我必須在某處混淆某種類型的語法。如果有人能指導我一點,那將不勝感激。

我比較的真正的字典大概有150個鍵,但我希望這個代碼很簡單。

+0

您使用的是什麼版本的Python? – Blckknght

回答

10

您需要遍歷關鍵的關鍵字,並對每個關鍵點進行比較。所以,直接修改你的代碼版本。

for key in crucial.keys(): 
    if key in dishes.keys(): 
     print dishes[key] 

它可以更好地表述爲(無需指定.keys):使用列表理解

for key in crucial: 
    if key in dishes: 
     print dishes[key] 
+0

在這種情況下keys()不是必需的,默認情況下,字典中的迭代就足夠了。 「for key in keys.keys()」等於「for key in critical」 –

+0

你是對的,列表理解是最好的選擇,但是我認爲一個明確的例子會對Python初學者有幫助。 – timc

+0

謝謝!這非常有幫助!我正在閱讀列表理解現在學習一點點... – yrekkehs

1

[ dishes[x] for x in crucial if dishes.has_key(x) ] 

,或者按gnibbler:

[ dishes[x] for x in crucial if x in dishes ] 

該表達式將迭代至關重要的每個關鍵,如果關鍵菜,它會返回菜中同一個鍵的值,最後,返回所有匹配值的列表。 (設置(關鍵)&設置(盤))返回兩個集合的公共密鑰,然後迭代這個集合並返回盤中的值。

[ dishes[x] for x in set (crucial) & set(dishes) ] 
+1

'has_key'已棄用。請使用'x in dishes'代替 –

+1

甚至'[盤[x]爲x設置(至關重要).intersection(盤)]'刮掉高達70ns :) – RocketDonkey

+0

這很酷! .. –

0

如果您還不熟悉Python的REPL(讀取 - 評估 - 打印 - 循環 - 在你鍵入代碼的那個東西,按回車鍵立即評估)這在這裏是一個很好的工具。

因此,讓我們開始打破你的代碼。

crucial = {'eggs': '','ham': '','cheese': ''} 
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500} 

夠簡單。雖然我注意到你在crucials字典中沒有任何值。我不確定這是否是您的縮寫,或者您僅僅是關心關鍵。如果你只關心鑰匙,那麼爲了確保唯一性,我假設你正在使用字典。在這種情況下,您應該查看set data structure

例子:

crutial = set(['cheese', 'eggs', 'ham']) 

繼續對我們有

if crucial.keys() in dishes.keys(): 

在這裏你正在使用的in comparison operator。例如:

5 in [5, 4] #True 
3 in [5, 4] #False 

如果我們評估crucial.keys()dishes.keys()我們得到

>>> crucial.keys() 
['cheese', 'eggs', 'ham'] 
>>> dishes.keys() 
['eggs', 'bacon', 'sausage', 'spam'] 

所以在執行過程中的代碼作爲計算

['cheese', 'eggs', 'ham'] in ['eggs', 'bacon', 'sausage', 'spam'] 

返回False,因爲該值['eggs', 'bacon', 'sausage'](這是一個列表)不在列表['eggs', 'bacon', 'sausage', 'spam'](實際上該列表中沒有列表,只有字符串)。

因此,你正在評估作爲

if False: 
    print dishes[value] #note value is not defined. 

它,而你好像混合/混淆了in操作返回boolean和對迭代器(for item in collection)。有這樣的事情的語法。它被稱爲list comprehensions,你可以在@ShawnZhang和@ kmad的答案中找到樣本。您可以將其視爲過濾和修改(映射)集合的簡潔方式,並返回列表作爲結果。我不想在這裏深入,或者我最終會介紹函數式編程。

您的其他選擇是分別使用for .. in迭代和in運算符。這是@timc給出的解決方案。對於初學者來說,這樣的解決方案可能更爲熟悉或更容易。它清楚地分離了迭代和過濾的行爲。它也更像是用其他編程語言編寫的,與列表理解不相同的編程語言。那些在Python中工作的人可能會喜歡理解語法。

+0

vossad01,我很欣賞這種迴應。我解救了你的解釋......並且更清楚地說明爲什麼它不適合我的試錯工作! – yrekkehs

2

如果您使用的是Python 3,則字典的keys方法將遵循set接口。這意味着您可以使用&運算符來執行兩個字典的鍵的交集。

for key in crucial.keys() & dishes.keys(): 
    print(dishes[key]) 

或者,如果你需要的值的列表:

result = [dishes[key] for key in crucial.keys() & dishes.keys()] 

在Python 2,你可以通過明確(從iterkeys發電機也許)創建集管理同樣的事情,但也許這將是更好地簡單地做一個循環的關鍵,就像其他答案的幾個建議。

這是循環中的一個變體,我不認爲我見過其他任何人。外循環同時得到dishes字典中的鍵和值,因此您不需要按鍵單獨查找值。

for key, value in dishes.iteritems(): # use items() in Python 3 
    if key in crucial: 
     print value 
+0

奇怪的是這個答案被忽略了。試過了。很好的工作,並改變了我想寫某些類型的代碼的方式。 –

-1
crucial = {'eggs': '','ham': '','cheese': ''} 
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500} 
for key in set(dishes.keys()) & set(crucial.keys()): 
    print dishes[key] 

同樣,你可以有set(dishes.keys()) - set(crucial.keys())set(dishes.keys()) | set(crucial.keys()),或set(dishes.keys())^set(crucial.keys())

+0

這樣,你可以設置(dishes.keys()) - set(crucial.keys()),set(dishes.keys())| set(crucial.keys())或set(dishes.keys())^ set(crucial.keys()) – JoeLiu

+1

只有代碼答案一般不是很好。您需要在答案**中添加解釋**。 –

相關問題