【问题标题】:How to check if a value exists in a dictionary (python)如何检查字典中是否存在值(python)
【发布时间】:2012-01-03 03:16:01
【问题描述】:

我在 python 中有以下字典:

d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}

我需要一种方法来查找此字典中是否存在诸如“一”或“二”之类的值。

例如,如果我想知道索引“1”是否存在,我只需输入:

"1" in d

然后python会告诉我这是对还是错,但是我需要做同样的事情,只是要查找一个值是否存在。

【问题讨论】:

    标签: python dictionary find


    【解决方案1】:

    Python 字典有get(key) 函数

    >>> d.get(key)
    

    例如,

    >>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
    >>> d.get('3')
    'three'
    >>> d.get('10')
    None
    

    如果您的密钥不存在,那么它将返回None 值。

    foo = d[key] # raise error if key doesn't exist
    foo = d.get(key) # return None if key doesn't exist
    

    与低于 3.0 和高于 5.0 的版本相关的内容。

    【讨论】:

    • 不回答问题。 OP 询问key:value 中的值而不是键。
    【解决方案2】:

    你可以用这个:

    d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
    print("one" in d.values)
    

    或者你可以使用任何函数:

    print(any([True for i,j in d1.items() if j == "one"]))
    

    【讨论】:

      【解决方案3】:

      在 Python 3 中,您可以使用

      "one" in d.values()
      

      测试"one" 是否在您的字典的值中。

      在 Python 2 中,使用效率更高

      "one" in d.itervalues()
      

      改为。

      请注意,这会触发对字典值的线性扫描,一旦找到就会短路,因此这比检查键是否存在效率要低得多。

      【讨论】:

      • 我知道这是一个 真的 旧答案,但只是想指出在 Python 3 中它是 values() 而不是 itervalues()。我进入了白痴模式一段时间,并试图让itervalues() 在 Python 3 中工作,然后才意识到我是个白痴。
      • @digitalformula 这正是我踏入的陷阱,非常感谢
      【解决方案4】:

      检查值存在的不同类型

      d = {"key1":"value1", "key2":"value2"}
      "value10" in d.values() 
      >> False
      

      如果值列表会怎样

      test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6']}
      "value4" in [x for v in test.values() for x in v]
      >>True
      

      如果值列表带有字符串值会怎样

      test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6'], 'key5':'value10'}
      values = test.values()
      "value10" in [x for v in test.values() for x in v] or 'value10' in values
      >>True
      

      【讨论】:

      • 不要使用value in [... list comprehension over sequence ...],使用any(value in sequence ...),以避免创建不用于其他任何用途的列表对象,并在找到值时短路。跨度>
      【解决方案5】:

      在 Python 3 中,您可以使用字典的 values() 函数。它返回值的视图对象。反过来,这可以传递给返回迭代器对象的iter 函数。可以使用in检查迭代器,像这样,

      'one' in iter(d.values())
      

      或者你可以直接使用视图对象,因为它类似于列表

      'one' in d.values()
      

      【讨论】:

      • 在字典视图中使用iter()没有意义in 已经将对象用作可迭代对象(该类型未实现专用的 __contains__ 方法)。 'one' in iter(d.values())'one in d.values() 之间的唯一区别是你让 Python 做了额外的工作(支付了全局查找 iter 的成本)。
      【解决方案6】:
      >>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
      >>> 'one' in d.values()
      True
      

      出于好奇,一些比较时间:

      >>> T(lambda : 'one' in d.itervalues()).repeat()
      [0.28107285499572754, 0.29107213020324707, 0.27941107749938965]
      >>> T(lambda : 'one' in d.values()).repeat()
      [0.38303399085998535, 0.37257885932922363, 0.37096405029296875]
      >>> T(lambda : 'one' in d.viewvalues()).repeat()
      [0.32004380226135254, 0.31716084480285645, 0.3171098232269287]
      

      编辑:如果您想知道为什么...原因是上述每个都返回不同类型的对象,这可能适合也可能不适合查找操作:

      >>> type(d.viewvalues())
      <type 'dict_values'>
      >>> type(d.values())
      <type 'list'>
      >>> type(d.itervalues())
      <type 'dictionary-valueiterator'>
      

      EDIT2:根据 cmets 中的要求...

      >>> T(lambda : 'four' in d.itervalues()).repeat()
      [0.41178202629089355, 0.3959040641784668, 0.3970959186553955]
      >>> T(lambda : 'four' in d.values()).repeat()
      [0.4631338119506836, 0.43541407585144043, 0.4359898567199707]
      >>> T(lambda : 'four' in d.viewvalues()).repeat()
      [0.43414998054504395, 0.4213531017303467, 0.41684913635253906]
      

      【讨论】:

      • 我手头没有 python,你能用 'four' 而不是 'one' 重新运行测试吗?
      • 毕竟没有必要,除非在更大的字典上运行。我猜 values() 中的开销是由复制值列表和 viewvalues() 中通过保持视图活动引起的。
      • 鉴于d 的小尺寸,时间实际上毫无意义。在 Python 3 中,dict.values() 是一个字典视图,默认情况下,dict.itervalues()dict.viewvalues() 消失了。您可以重新测试它(使用更大的字典)并使用 list(d.values()) 来获取 Python 2 行为,并使用 iter(d.values()) 来获取 dict.itervalues() 行为,但是因为这两个版本都需要全局查找和调用,所以它们'绝对会慢一些。两者都做了不需要的额外工作。
      【解决方案7】:

      使用字典视图:

      if x in d.viewvalues():
          dosomething()..
      

      【讨论】:

        猜你喜欢
        • 2021-11-30
        • 2021-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多