Python检查列表中的任何元素是否是字典中的键

Python检查列表中的任何元素是否是字典中的键,python,list,dictionary,Python,List,Dictionary,检查列表中的任何元素是否是字典中的键的python方法是什么? 例如,我有一个水果列表: fruits = ['apples', 'bananas', 'pears'] 想知道我的字典里有没有什么水果,例如: fruit_dict1 = {'apples': 4, 'oranges': 3, 'dragonfruit': 4} returns True fruit_dict2 = {'oranges': 3, 'dragonfruit': 9, 'pineapples': 4} return

检查列表中的任何元素是否是字典中的键的python方法是什么?

例如,我有一个水果列表:

fruits = ['apples', 'bananas', 'pears']
想知道我的字典里有没有什么水果,例如:

fruit_dict1 = {'apples': 4, 'oranges': 3, 'dragonfruit': 4} returns True

fruit_dict2 = {'oranges': 3, 'dragonfruit': 9, 'pineapples': 4} returns False
到目前为止,我已经:

def fruit_checker(list, dict):
    for fruit in list:
        if fruit in dict:
            return True
    return False

仅仅在字典中查找水果感觉很奇怪,但似乎“在”中只搜索字典键不同类型的“in”究竟是如何工作的?

将遍历列表的生成器传递给
任意

fruits = ['apples', 'bananas', 'pears']
fruit_dict1 = {'apples': 4, 'oranges': 3, 'dragonfruit': 4}

print(any(list_item in fruit_dict1 for list_item in fruits))
>> True

fruit_dict2 = {'oranges': 3, 'dragonfruit': 9, 'pineapples': 4}

print(any(list_item in fruit_dict2 for list_item in fruits))
>> False

让我们定义变量:

>>> fruits = ['apples', 'bananas', 'pears']
>>> fruit_dict1 = {'apples': 4, 'oranges': 3, 'dragonfruit': 4}
>>> fruit_dict2 = {'oranges': 3, 'dragonfruit': 9, 'pineapples': 4}
现在,让我们测试一下会员资格:

>>> bool(set(fruits).intersection(fruit_dict1))
True
>>> bool(set(fruits).intersection(fruit_dict2))
False
工作原理
set(水果)
是水果的集合。我们想知道这组键和你的字典的键之间是否有重叠。为了确定重叠的位置,我们可以使用相交法:

要将非空交叉口的值转换为True,或将空交叉口的值转换为False,我们使用bool:

微小变化 如果我们颠倒顺序,同样的原则是:

>>> bool(set(fruit_dict1).intersection(fruits))
True
>>> bool(set(fruit_dict2).intersection(fruits))
False
试试这个

In [1]: any([i in fruit_dict1 for i in fruits])
Out[1]: True
In [2]: any([i in fruit_dict2 for i in fruits])
Out[2]: False
工作

In [11]: [i in fruit_dict2 for i in fruits]
Out[11]: [False, False, False]
检查每个存在的元素。并返回布尔值列表,如果存在任何
True
,则
any
将返回

In [13]: any([True,False,False])
Out[13]: True
或使用计数器

from collections import Counter
any(Counter(fruits) & Counter(fruit_dict1.keys()))

如果在
中使用
和字典,如果它完全符合您的要求,为什么会觉得奇怪呢?回答您的问题:请参阅。简单地说,如果您的对象定义了
\uuuuu包含
\uuuu iter\uuuu
\uuuu getitem\uuuuu
,那么
中的
操作符应该可以工作。由执行部门来做一些明智的事情。对于
dict
\uuuuu contains\uuuu
如果传递的值在键中,则返回True。在第一个解决方案中,您不需要创建额外的列表。你可以
任何(水果中的水果\u dict表示水果中的i)
。您也不需要
键()
,默认情况下,
操作符中的
会执行此操作。使用列表理解和
keys()
可以创建两个额外的列表。这里很琐碎,但在其他情况下可能代价高昂。@RahulKP,Inauld是对的,请接受我不使用keys()方法的编辑,我将使其成为可接受的answer@devonJS更新了我的答案。
In [13]: any([True,False,False])
Out[13]: True
set(fruits) & set(fruit_dict1.keys())
from collections import Counter
any(Counter(fruits) & Counter(fruit_dict1.keys()))