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

15

如何用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" 只对字典的键进行搜索。 "in" 如何与不同类型一起工作?


为什么使用in与字典一起时感觉奇怪,即使它确实做了你想要的事情? - DeepSpace
1
回答你的问题:请参阅 https://docs.python.org/2/reference/datamodel.html#object.__contains__。简而言之,如果您的对象定义了 __contains____iter____getitem__,那么 in 运算符应该可以工作。具体实现取决于实现方式。对于 dict__contains__ 返回 True 如果传递的值在键中。 - Alok Singhal
字典的键是一个序列;链接副本中使用的所有相同技术都适用。 - Karl Knechtel
4个回答

18

试试这个

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
在你的第一个解决方案中,你不需要创建额外的列表。你可以使用 any(fruit in fruit_dict for i in fruits)。你也不需要 keys()in 运算符默认会执行该操作。通过列表推导式和 keys(),你正在创建两个额外的列表。在这里微不足道,但在其他情况下可能会很昂贵。 - kylieCatt
@RahulKP,IanAuld是正确的,请接受我的编辑而不使用keys()方法,我会将其作为被接受的答案。 - devonj
@devonJS 我更新了我的回答。 - Rahul K P

7

让我们定义您的变量:

>>> 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) 是水果集合。我们想要找到这个集合和你的字典的键集合之间是否存在重叠部分。要查找重叠部分,我们可以使用 intersection 方法:

>>> 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

4

将一个迭代列表的生成器传递给 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

2
set(fruits) & set(fruit_dict1.keys())

或者使用计数器。
from collections import Counter
any(Counter(fruits) & Counter(fruit_dict1.keys()))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接