2012-12-05 137 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

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

相关问题