python - 如何确定找到的两个键是否属于来自dicts列表的同一个dict

时间:2015-02-18 23:19:05

标签: python dictionary

我有一个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

但我怎么验证他们都来自同一个字典?

2 个答案:

答案 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"如果根本找不到密钥,则会引发异常。