如果您還不熟悉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中工作的人可能會喜歡理解語法。
您使用的是什麼版本的Python? – Blckknght