列表索引超出范围

米格斯

我正在尝试在python中创建自己的哈希数据结构。__init__初始化m_list大小列表()的m同时,在另一个函数中,我从哈希函数向其添加哈希。

我现在正在尝试搜索列表,以寻找价值kif 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

如果要轻松访问索引和值,则可以使用的另一种选择enumerateenumerate返回包含值索引和值本身的元组,因此您可以使用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的列表,您需要在列表中有一个要复制的元素。您可以使用None0作为该值:[0] * m给出一个m列表,并[None] * m给出一个m无值列表

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章