如何找到字典中是否存在密钥?

时间:2015-05-11 18:41:15

标签: python list python-2.7 dictionary

我想在python中编写一个程序,在list中找到一个值。 像这样:

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而返回错误。

我怎么能用我的想法做到这一点?

4 个答案:

答案 0 :(得分:5)

注意:您在arr中引用的项目实际上在Python中称为list。 "哈希表"实际上被称为字典。因此,我将arr对象称为dict_object

您可以使用in运算符检查字典中是否存在密钥,

if i * 2 in dict_object:
    print "!"

如果in是字典中的有效密钥,则True运算符将返回i * 2,否则为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函数从第一个参数运行,直到最后一个参数值 - 例如,

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

答案 1 :(得分:0)

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

用于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()将返回key s。

字典也有get(key, message)方法,如果此字典有这样的键,此方法将返回其值,否则为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

答案 2 :(得分:0)

您的问题实际上非常令人困惑,因为在您的第一个代码段中,您将迭代列表的索引,而在第二个代码段中,您将创建一个字典,其中列表的元素作为键。现在不可能告诉你你真正想要的是什么,所以这里有一个答案,以防万一你真的想要检查索引 i*2是否对任何有效的<有效< em> index i

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

此代码段可以有效地创建并分配给y一个列表,该列表是从原始列表x的每个有效索引到表示是否为{{1}的布尔值的映射}})或不(True)索引False小于数组的长度。

演示:

i*2

答案 3 :(得分:0)

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

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