列表索引超出范围

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

另一个选项,如果你想轻松访问索引和值,是使用 enumerateenumerate 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 的列表,您需要复制列表中的一个元素。您可以使用 None0 作为该值:[0] * m 给出了 m 个零的列表,[None] * m 给出了 m none 值。