如果您还不熟悉 Python 的 REPL(Read-Evaluate-Print-Loop - 您输入代码的地方,按 Enter 并立即计算),这将是一个很好的工具。
因此,让我们开始分解您的代码。
crucial = {'eggs': '','ham': '','cheese': ''}
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
很简单。crucials
尽管我注意到您在字典中没有任何值。我不确定这是否是您示例的缩写,或者您是否只是关心键。如果您只关心键,那么我假设您使用字典是为了确保唯一性。在这种情况下,您应该检查set
数据结构。
例子:
crutial = set(['cheese', 'eggs', 'ham'])
继续我们有
if crucial.keys() in dishes.keys():
在这里,您使用的是in
比较运算符。例子:
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
返回布尔值的运算符和 for 迭代器 ( for item in collection
)。这种事情有一种语法。它被称为列表推导,您可以在@ShawnZhang 和@kmad 的答案中找到示例。您可以将其视为过滤和修改(映射)集合的简洁方法,并返回一个列表作为结果。我不想在这里太深入,否则我最终会介绍函数式编程。
您的另一个选择是分别使用for .. in
迭代和in
运算符。这是@timc 给出的解决方案。对于初学者来说,这样的解决方案可能更熟悉或更容易。它清楚地区分了迭代和过滤的行为。它也更像是用其他没有与列表推导等效的编程语言编写的内容。那些经常使用 Python 工作的人可能会喜欢理解语法。