我正在尝试在python中创建自己的哈希数据结构。在__init__
初始化m_list
大小列表()的m
同时,在另一个函数中,我从哈希函数向其添加哈希。
我现在正在尝试搜索列表,以寻找价值k
。我if self.m_list[i] == k:
在行上得到列表索引超出范围错误。
class Hash:
def __init__ (self, n, m, m_list=None):
self.n = n
self.m = m
self.a = choice(range(1, n))
self.b = choice(range(n))
if m_list is None:
m_list = []
self.m_list = m_list * m
def search(self, k):
found = False
for i in self.m_list:
if i is not None and found is False:
if self.m_list[i] == k:
found = True
if found:
print True
else:
print False
我m_list
使用在python中创建具有一定大小的空列表中的准则创建
此代码存在多个问题:
1)用其自己的内容索引列表。
for i in self.m_list:
当使用此语法你在Python列表上循环,在变量(值i
)是值从列表中,而不是该次迭代的索引。
有两种方法可以解决此问题。如果出于某种原因需要索引,则可以使用range
函数创建索引并对其进行循环,如下所示:
for i in range(len(self.m_list)):
if not found and self.m_list[i] == k:
found = True
或者,您可以仅在列表的内容上使用python的本机迭代:
for item in self.m_list:
if not found and item == k:
found = True
如果要轻松访问索引和值,则可以使用的另一种选择enumerate
。enumerate
返回包含值索引和值本身的元组,因此您可以使用python的多重赋值来访问这两者:
for i, val in enumerate(self.m_list):
if val == k:
...
if i == some_index
...
原始代码只会在m_list[i] == i == k
满足以下条件时返回true ,因此,如果您缩进检查该条件是否成立,则只需进行检查即可m_list[k] == k
。
2)正如彼得的回答所述,[] * m
始终给出[]
,因此无论所提供的索引是什么,列表的长度都为零,因此任何索引都将超出范围。要获得长度为m的列表,您需要在列表中有一个要复制的元素。您可以使用None
或0
作为该值:[0] * m
给出一个m
零列表,并[None] * m
给出一个m
无值列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句