我有一个dicts列表,我试图找到两个密钥,如果找到,请确保它们属于同一个字典。到目前为止我所拥有的:
foo = [{'apples': 1, 'banana': 2}, {'people': 1, 'monkeys': 2}]
food = any(d['apples'] == 1 for d in foo)
mammals = any(d['banana'] == 2 for d in foo)
if food and mammals:
return True
但我怎么验证他们都来自同一个字典?
答案 0 :(得分:3)
只需立即检查两个密钥,就不需要进行任何其他检查:
foo = [{'apples': 1, 'banana': 4}, {'people': 1, 'monkeys': 2}]
print(any(d.get('apples') == 1 and d.get('banana')== 2 for d in f))
如此简单:
return any(d.get('apples') == 1 and d.get('banana')== 2 for d in f)
就目前而言,你实际上会得到keyError
,你应该使用dict.get
来捕捉每个字典中缺少任何键的时间。
答案 1 :(得分:1)
良好的第一次尝试,试试这个:
foo = [{'apples': 1, 'banana': 2}, {'people': 1, 'monkeys': 2}]
food = [('apples' in d and 'bannana' in d) for d in foo]
如果我理解你的口头描述,那么列表" foo"现在将包含项目" True"或" False",表示每个字典是否包含两个键。要查看集合中的任何字典都是如此,请使用" any"功能,和以前一样:
contained_and_in_same_dic = any(food)
为了利用延迟评估,我们可以从列表切换到生成器并写入:
contained_and_in_same_dic = any( (('apples' in d and 'bannana' in d) for d in foo) )
这里的优点是,一旦找到匹配就可以突破评估,但这只会对非常大的列表显而易见
注意:您的解决方案与您的口头描述不符。 " if == 1"如果根本找不到密钥,则会引发异常。