我想在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而返回错误。
我怎么能用我的想法做到这一点?
答案 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
。