列表索引超出范围
List index out of range
我正在尝试在 python 中创建自己的哈希数据结构。在 __init__
中,我初始化了一个大小为 m
的列表 (m_list
),在另一个函数中,我从我的哈希函数中向它添加了哈希。
我现在正在尝试搜索列表,寻找值 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
您没有创建大小为 m
的列表。 [] * m
给你 []
,正如你在交互式 shell 中看到的那样。链接的答案显示了如何乘以列表将浅层复制列表的内容 m
次,但当然 []
没有要复制的内容。尝试 if m_list is None: m_list = [None] * m
或类似的东西。
你的搜索方法对我来说毫无意义(有更好的方法来存储整数的存在)但这是一个单独的问题。
此代码存在多个问题:
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
returns 包含值索引和值本身的元组,因此您可以使用 python 的多重赋值来访问两者:
for i, val in enumerate(self.m_list):
if val == k:
...
if i == some_index
...
只有在 m_list[i] == i == k
时,原始代码才会 return 为真,因此如果您缩进检查此条件是否成立,您可以只检查 m_list[k] == k
.
2) 如 Peter 的回答所述,[] * m
总是给出 []
,因此无论提供的索引是什么,列表的长度都将为零,因此任何索引都将超出范围。要获得长度为 m 的列表,您需要复制列表中的一个元素。您可以使用 None
或 0
作为该值:[0] * m
给出了 m
个零的列表,[None] * m
给出了 m
none 值。
我正在尝试在 python 中创建自己的哈希数据结构。在 __init__
中,我初始化了一个大小为 m
的列表 (m_list
),在另一个函数中,我从我的哈希函数中向它添加了哈希。
我现在正在尝试搜索列表,寻找值 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
您没有创建大小为 m
的列表。 [] * m
给你 []
,正如你在交互式 shell 中看到的那样。链接的答案显示了如何乘以列表将浅层复制列表的内容 m
次,但当然 []
没有要复制的内容。尝试 if m_list is None: m_list = [None] * m
或类似的东西。
你的搜索方法对我来说毫无意义(有更好的方法来存储整数的存在)但这是一个单独的问题。
此代码存在多个问题:
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
returns 包含值索引和值本身的元组,因此您可以使用 python 的多重赋值来访问两者:
for i, val in enumerate(self.m_list):
if val == k:
...
if i == some_index
...
只有在 m_list[i] == i == k
时,原始代码才会 return 为真,因此如果您缩进检查此条件是否成立,您可以只检查 m_list[k] == k
.
2) 如 Peter 的回答所述,[] * m
总是给出 []
,因此无论提供的索引是什么,列表的长度都将为零,因此任何索引都将超出范围。要获得长度为 m 的列表,您需要复制列表中的一个元素。您可以使用 None
或 0
作为该值:[0] * m
给出了 m
个零的列表,[None] * m
给出了 m
none 值。