Python 比较两个字典的键值并在匹配时返回值
我是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),它将
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())代码,但答案通常不是很好。你需要在你的答案中添加一个解释。奇怪的是,这个答案怎么会被忽视。试过了。非常有效,并且改变了我对编写某些类型代码的想法。