【问题标题】:How can I find if key exists in a dictionary?如何查找字典中是否存在键?
【发布时间】:2015-05-11 18:41:14
【问题描述】:

我想在 python 中编写一个在列表中查找值的程序。 像这样的:

arr = [1, 14, 2, 4, 5, 11, 8, 10]
for i in range(1, len(arr)):
    if(i * 2 in arr):
        print "!"

我要检查的数组要长得多,所以需要很长时间。
我想出了一个想法来制作一个哈希表而不是一个列表。 像这样:

arr = {1: "something", 14: "something", 2: "something", 4: "something",
       5: "something", 11: "something", 8: "something", 10: "something"}

我的想法是检查i 是否等于2 以便检查arr[i*2] 是否会返回某些内容,因为这样程序就不需要查找某些内容来调用它(如果存在)。

问题是如果i 等于3 那么它会检查arr[3*2] 是否会返回一些东西,它不会因为没有键6 并且它会返回一个错误。

我的想法如何做到这一点?

【问题讨论】:

  • 可以使用get方法:arr.get(3*2, None)
  • @DmytroKuznetsov 默认值是None only :-)
  • 所以基本上你真正想要做的是看看 i*2 是否小于列表的长度?我只是问,因为你的问题很奇怪。你不需要字典。

标签: python list python-2.7 dictionary


【解决方案1】:

注意:您所指的项目arr实际上在Python中称为list。而“哈希表”实际上被称为字典。所以,我将arr 对象称为dict_object


您可以使用in 运算符来检查该键是否在字典中,

if i * 2 in dict_object:
    print "!"

如果i * 2 是字典中的有效键,in 运算符将返回 True,否则返回 False


还有另一种方法可以做到这一点。字典对象有一个名为get 的函数,如果在字典中找不到键,则该函数接受要返回的默认值。默认返回值为None。你可以使用None作为标记值,​​像这样

if dict_object.get(i * 2) is not None:
    # If the returned value is not None, then the key is present in the dictionary
    print "!"

还有另一种方法可以做到这一点。当您访问字典中不存在的密钥时,您将获得KeyError。你可以除此之外,像这样

for i in range(1, len(dict_object) + 1):
    try:
        if dict_object[i * 2]:
            print "!"
    except KeyError:
         # If value of `i * 2` is not in the dictionary, we will reach here
         pass

除此之外,如果不使用您存储在字典中的值(换句话说,如果您只担心键),那么您可以使用 set 代替字典,就像这样

numbers_set = {1, 14, 2, 4, 5, 11, 8, 10}    # Note {..}, not [..]
if i * 2 in numbers_set:
    print "!"

如果您已经有了列表,那么您可以将列表转换为集合,使用set 函数,就像这样

numbers_set = set([1, 14, 2, 4, 5, 11, 8, 10])
if i * 2 in numbers_set:
    print "!"

PS:您的程序存在错误。在 Python 中,range 函数从第一个参数开始运行,直到最后一个参数值 - 1。例如,

>>> range(1, 5)
[1, 2, 3, 4]
>>> range(2, 10)
[2, 3, 4, 5, 6, 7, 8, 9]

最后一个值将不包括在内。所以,你需要像这样改变range的参数

for i in range(1, len(x) + 1):

【讨论】:

    【解决方案2】:

    老实说,我不明白你打算做什么,但你有一些选择。

    为您的arr 字典(哈希表)

    >>> arr
    {1: 'something', 2: 'something', 4: 'something', 5: 'something', 8: 'something', 10: 'something', 11: 'something', 14: 'something'}
    >>> arr.keys()
    [1, 2, 4, 5, 8, 10, 11, 14]
    

    arr.keys() 将返回 keys。

    字典也有get(key, message)方法,如果这个字典有这个key,这个方法就会返回它的值,否则message(默认None)。

    >>> for i in range(len(arr)):
        print arr.get(i*2, "message")
    
    
    
    something
    something
    message
    something
    something
    message
    something
    message
    

    或者用按键打印,更清楚

    >>> for i in range(len(arr)):
        print i, arr.get(i*2)
    
    
    0 None
    1 something
    2 something
    3 None
    4 something
    5 something
    6 None
    7 something
    

    或仅针对现有值打印消息

    >>> for i in range(len(arr)):
        if i in arr.keys(): print arr.get(i*2)
    
    
    something
    something
    something
    something
    

    或者这个。

    >>> for i in range(len(arr)):
        if i in arr.keys(): print i,"--->", arr.get(i*2)
    
    
    1 ---> something
    2 ---> something
    4 ---> something
    5 ---> something
    

    【讨论】:

      【解决方案3】:

      我认为字典的get 方法是你想要的。

      如果您执行arr.get(2),它将返回您想要的值,如果没有值,则返回None

      【讨论】:

        【解决方案4】:

        您的问题实际上非常令人困惑,因为在您的第一个代码 sn-p 中,您正在迭代列表的索引,而在第二个代码中,您正在创建一个以列表元素作为键的字典。此时无法说出您真正想要什么,所以这里有一个答案,以防您真的想检查 index i*2 是否对任何有效的 index都有效> i.

        n = len(x)
        y = [True]*sum(divmod(n, 2)) + [False]*(n//2)
        

        此代码 sn-p 可以有效地创建并分配给y,该列表是从原始列表的每个有效索引x 到指示是否为 (True) 或不是 (False) 索引 i*2 小于数组的长度。

        演示:

        >>> x = [None] * 3
        >>> n = len(x)
        >>> y = [True]*sum(divmod(n, 2)) + [False]*(n//2)
        >>> y
        [True, True, False]
        >>> x = [None] * 4
        >>> n = len(x)
        >>> y = [True]*sum(divmod(n, 2)) + [False]*(n//2)
        >>> y
        [True, True, False, False]
        

        【讨论】:

          猜你喜欢
          • 2012-03-27
          • 2016-03-20
          • 2018-08-10
          • 2022-01-12
          • 2012-07-31
          • 1970-01-01
          • 1970-01-01
          • 2021-11-02
          • 1970-01-01
          相关资源
          最近更新 更多