我正在尝试在python中创建自己的Hash数据结构。在__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
我使用Create an empty list in python with certain size
中的指南创建了m_list
答案 0 :(得分:2)
此代码存在多个问题:
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)如Peter的回答所述,[] * m
始终给出[]
,因此无论提供的索引是什么,列表都将具有零长度,因此任何索引都将超出范围。要获取长度为m的列表,您需要在列表中包含一个要复制的元素。您可以使用None
或0
作为该值:[0] * m
列出m
个零,[None] * m
列出m
无值。
答案 1 :(得分:1)
您没有创建大小为m
的列表。正如您在交互式shell中所看到的,[] * m
为您提供了[]
。链接的答案显示了如何将列表相乘以复制列表m
次的内容,但当然[]
没有要复制的内容。试试if m_list is None: m_list = [None] * m
或类似的东西。
您的搜索方法对我没有意义(有更好的方法来存储整数的存在)但这是一个单独的问题。