Python检查列表中的任何元素是否是字典中的键
检查列表中的任何元素是否是字典中的键的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
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()))