列表索引超出范围

时间:2015-02-09 21:40:13

标签: python python-2.7 hash

我正在尝试在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

2 个答案:

答案 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

另一个选择,如果您想要轻松访问索引和值,则使用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)如Peter的回答所述,[] * m始终给出[],因此无论提供的索引是什么,列表都将具有零长度,因此任何索引都将超出范围。要获取长度为m的列表,您需要在列表中包含一个要复制的元素。您可以使用None0作为该值:[0] * m列出m个零,[None] * m列出m无值。

答案 1 :(得分:1)

您没有创建大小为m的列表。正如您在交互式shell中所看到的,[] * m为您提供了[]。链接的答案显示了如何将列表相乘以复制列表m次的内容,但当然[]没有要复制的内容。试试if m_list is None: m_list = [None] * m或类似的东西。

您的搜索方法对我没有意义(有更好的方法来存储整数的存在)但这是一个单独的问题。