Pythonic检查列表中的任何元素是否是字典中的键的方法是什么?
例如,我有一份水果清单:
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”与不同类型的合作方式究竟如何?
答案 0 :(得分:7)
试试这个
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]
检查存在的每个元素。并返回一个布尔值列表,如果存在任何any
,True
将返回。
In [13]: any([True,False,False])
Out[13]: True
答案 1 :(得分:6)
让我们定义你的变量:
>>> 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(fruits)
是一套水果。我们想要查找此集与字典的键集之间是否有任何重叠。要找到重叠的内容,我们可以使用交集方法:
>>> set(fruits).intersection(fruit_dict1)
set(['apples'])
要将此转换为True表示非空交集,或将False转换为空交集,我们使用 bool :
>>> bool(set(fruits).intersection(fruit_dict1))
True
如果我们颠倒顺序,原则相同:
>>> bool(set(fruit_dict1).intersection(fruits))
True
>>> bool(set(fruit_dict2).intersection(fruits))
False
答案 2 :(得分:3)
将遍历列表的生成器传递给any
:
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
答案 3 :(得分:0)
set(fruits) & set(fruit_dict1.keys())
或使用计数器
from collections import Counter
any(Counter(fruits) & Counter(fruit_dict1.keys()))