如果您还不熟悉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