比较两个词典的关键值和返回值如果匹配

时间:2012-12-05 01:35:06

标签: python dictionary

我是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个键,但我希望这段代码足够简单。

7 个答案:

答案 0 :(得分:15)

你需要迭代关键的密钥,并将每个密钥与菜肴密钥进行比较。所以直接修改了你的代码版本。

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]

答案 1 :(得分: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 dict获取键和值,因此您无需单独按键查找值。

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

答案 2 :(得分:1)

使用列表理解是好的

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

或者,根据gnibbler:

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

这个表达将迭代关键的每个键,如果键入菜肴,它将返回菜肴中相同键的值,最后,返回所有匹配值的列表。

或者,您可以使用这种方式,(set(critical)& set(dishes))返回两个集合的公共密钥,然后迭代这个集合并返回菜肴中的值。

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

答案 3 :(得分:0)

Python 3中已删除

has_key()http://docs.python.org/3.1/whatsnew/3.0.html#builtins

相反,您可以使用:

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

此处使用的方法称为列表推导。你可以在这里阅读:

http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

答案 4 :(得分:0)

如果您还不熟悉Python的REPL(Read-Evaluate-Print-Loop - 您输入代码的内容,请按Enter键并立即进行评估),这将是一个很好的工具。

让我们开始分解您的代码。

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运算符,它返回一个布尔值和for迭代器(for item in collection)。这种事情有一种语法。它被称为list comprehensions,您可以在@ShawnZhang和@ kmad的答案中找到样本。您可以将其视为一种简洁的方法来过滤和修改(映射)集合,并返回列表作为结果。我不想在那里深入研究,或者最终会介绍函数式编程。

您的另一个选择是分别使用for .. in次迭代和in运算符。这是@timc给出的解决方案。对于初学者来说,这样的解决方案可能更熟悉或更容易。它清楚地区分了迭代和过滤的行为。它也更像是其他编程语言中没有与列表推导相当的东西。那些在Python中工作很多的人可能会喜欢理解语法。

答案 5 :(得分:0)

您可以使用 Counter

import operator
from collections import Counter

def mio(si, ti):
    si = Counter(s)
    ti = Counter(t)
    if operator.eq(si, ti):
        return True
    return False

答案 6 :(得分:-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())