Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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—如何从dict列表中确定找到的两个键是否属于同一dict_Python_Dictionary - Fatal编程技术网

python—如何从dict列表中确定找到的两个键是否属于同一dict

python—如何从dict列表中确定找到的两个键是否属于同一dict,python,dictionary,Python,Dictionary,我有一个单子,我想在其中找到两个键,如果找到了,确保它们属于同一本词典。到目前为止,我所拥有的: 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 但是如何验证它们都来

我有一个单子,我想在其中找到两个键,如果找到了,确保它们属于同一本词典。到目前为止,我所拥有的:

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

但是如何验证它们都来自同一本词典呢?

第一次尝试很好,请尝试以下方法:

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”将引发异常。

只需同时检查两个密钥,则无需进行任何其他检查:

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
来捕获每个dict中缺少的任何键

@Michael,别担心。