我是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 :(得分: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)
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())
。