【问题标题】:Python check if any element in a list is a key in dictionaryPython检查列表中的任何元素是否是字典中的键
【发布时间】:2016-07-07 06:34:31
【问题描述】:

检查列表中的任何元素是否是字典中的键的 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 完全符合您的要求,为什么会觉得奇怪?
  • 回答您的问题:请参阅docs.python.org/2/reference/datamodel.html#object.__contains__。简而言之,如果您的对象定义了__contains____iter____getitem__,那么in 运算符应该可以工作。由实施决定做一些明智的事情。对于dict,如果传递的值在键中,__contains__ 返回 True。

标签: python list dictionary


【解决方案1】:

试试这个

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]

检查存在的每个元素。并返回一个布尔值列表,如果存在任何Trueany 将返回。

In [13]: any([True,False,False])
Out[13]: True

【讨论】:

  • 在您的第一个解决方案中,您不需要创建额外的列表。你可以any(fruit in fruit_dict for i in fruits)。您也不需要keys(),默认情况下in 运算符会这样做。使用列表理解和 keys() 您正在创建 2 个额外的列表。在这里微不足道,但在其他情况下可能代价高昂。
  • @RahulKP,IanAuld 是对的,请接受我在没有 keys() 方法的情况下进行的编辑,我会将其作为接受的答案
  • @devonJS 更新了我的答案。
【解决方案2】:
set(fruits) & set(fruit_dict1.keys())

或使用计数器

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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案4】:

      让我们定义你的变量:

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

      【讨论】:

        猜你喜欢
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 2020-06-20
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多