Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两个字典的键值并在匹配时返回值_Python_Dictionary - Fatal编程技术网

Python 比较两个字典的键值并在匹配时返回值

Python 比较两个字典的键值并在匹配时返回值,python,dictionary,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] 我想做的是——如果Critical在盘子里有一把钥匙(在本例中是,egs),它将

我是Python的初学者,但我一直在尝试这种语法,但我无法理解它——这真是令人困惑

crucial = {'eggs': '','ham': '','cheese': ''}
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}

if crucial.keys() in dishes.keys():
    print dishes[value]
我想做的是——如果Critical在盘子里有一把钥匙(在本例中是,
egs
),它将返回
2
。这看起来很简单,但我相信我一定是弄乱了某种语法。如果有人能给我一点指导,我将不胜感激


我正在比较的真正的字典大约有150个键长,但我希望这段代码足够简单

您需要迭代Critical中的键,并将每个键与菜谱键进行比较。因此,您的代码的直接修改版本

for key in crucial.keys():
    if key in dishes.keys():
        print dishes[key]
crucial = {'eggs': '','ham': '','cheese': ''}
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
可以更好地表述为(无需指定.key):


使用列表理解是很好的

[ dishes[x] for x in crucial if dishes.has_key(x) ]
或者,根据gnibbler:

[ dishes[x] for x in crucial if x in dishes ]
这个表达式将迭代Critical中的每一个key,如果key在displays中,它将返回displays中相同key的值,最后返回所有匹配值的列表

或者,您可以使用这种方式,(set(critical)&set(displays))返回两个集合的公共键,然后迭代该集合并返回displays中的值

[ dishes[x] for x in set (crucial) & set(dishes) ]
已在Python 3中删除\u key()

相反,您可以使用:

[dishes[key] for key in crucial.keys() if key in dishes]
这里使用的方法称为列表理解。您可以在此处阅读:


如果您还不熟悉Python的REPL(阅读Evaluate Print Loop——输入代码的地方,按enter键,它会立即进行计算),这将是一个很好的工具

因此,让我们开始分解您的代码

for key in crucial.keys():
    if key in dishes.keys():
        print dishes[key]
crucial = {'eggs': '','ham': '','cheese': ''}
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
很简单。尽管我注意到您在
cracials
字典中没有任何值。我不确定这是你的缩写,或者你只是关心钥匙。如果您只关心键,那么我假设您使用字典是为了确保唯一性。在这种情况下,您应该查看

例如:

crutial = set(['cheese', 'eggs', 'ham'])
5 in [5, 4] #True
3 in [5, 4] #False
继续我们有

if crucial.keys() in dishes.keys():
这是您使用的。例如:

5 in [5, 4] #True
3 in [5, 4] #False
如果我们评估
critical.keys()
displays.keys()
我们得到

 >>> crucial.keys()
 ['cheese', 'eggs', 'ham']
 >>> dishes.keys()
 ['eggs', 'bacon', 'sausage', 'spam']
因此,在执行过程中,代码的计算结果如下

 ['cheese', 'eggs', 'ham'] in ['eggs', 'bacon', 'sausage', 'spam']
它返回False,因为值
['eggs'、'bacon'、'bacon']
(这是一个列表)不在列表中
['eggs'、'bacon'、'bacon'、'spam']
(事实上,该列表中没有列表,只有字符串)

因此,您将评估为

if False:
    print dishes[value] #note value is not defined.
看起来您混合/混淆了中的
运算符,该运算符返回布尔值和for迭代器(
for集合中的项
)。这类事情有一个语法。你可以在@ShawnZhang和@kmad的答案中找到它的样本。您可以将其视为筛选和修改(映射)集合的一种简洁方式,并返回一个列表作为结果。我不想在这里太深入,否则我将介绍函数式编程


您的另一个选择是将
用于。。在
迭代中和在
中分别使用运算符。这就是@timc给出的解决方案。对于初学者来说,这样的解决方案可能更熟悉或更容易。它清楚地区分了迭代和过滤的行为。它也更像是用其他编程语言编写的,这些语言没有与列表理解等价的语言。那些经常使用Python的人可能会喜欢理解语法。

如果您使用的是Python 3,字典的
方法遵循
接口。这意味着您可以使用
&
运算符将两个字典的键进行交叉

for key in crucial.keys() & dishes.keys():
    print(dishes[key])
或者,如果您需要一个值列表:

result = [dishes[key] for key in crucial.keys() & dishes.keys()]
在Python2中,您可以通过显式地创建集合(可能是从
iterkeys
生成器)来管理同样的事情,但可能最好是简单地在键上进行循环,就像其他几个答案所建议的那样

这是循环的一个变体,我想我没见过其他人这么做。外部循环从
disks
dict获取键和值,因此不需要按键分别查找值

for key, value in dishes.iteritems(): # use items() in Python 3
    if key in crucial:
        print value
类似地,您可以使用
set(disks.keys())-set(critical.keys())
set(disks.keys())| set(critical.keys())
,或
set(disks.keys())^set(critical.keys())
您可以使用:


在这种情况下不需要keys(),默认情况下,字典中的迭代就足够了。“for key-in-critical.keys()”等于“for key-in-critical”您是对的,列表理解是最好的选择,但是我认为一个显式示例对Python初学者会有帮助。谢谢!这是非常有用的!我现在正在通读理解列表来了解更多…不客气!列表理解绝对是这样做的首选方式,这样你就不会在阅读时出错。
has\u key
不推荐使用。请使用碟形图中的
x,而不是
[碟形图[x]表示碟形图中的x(关键)。交叉点(碟形图)]
来消除一个巨大的70纳秒:)您使用的是什么版本的Python?vossad01,我感谢您的回复。我保存了你的解释。。。更明显的一点是,为什么我的尝试和错误的努力不起作用!通过这种方式,您可以使用set(disks.keys())-set(critical.keys())、set(disks.keys())| set(critical.keys())或set(disks.keys())^set(critical.keys())代码,但答案通常不是很好。你需要在你的答案中添加一个解释。奇怪的是,这个答案怎么会被忽视。试过了。非常有效,并且改变了我对编写某些类型代码的想法。