1

更新了,看底部!

我被困住了!我得到一个 IndexError: list index out of range 错误。

def makeInverseIndex(strlist):
    numStrList = list(enumerate(strlist))
    n = 0 
    m = 0 
    dictionary = {}
    while (n < len(strList)-1):
        while (m < len(strlist)-1):
            if numStrList[n][1].split()[m] not in dictionary:
                dictionary[numStrList[n][1].split()[m]] = {numStrList[n][0]}
                m = m+1
            elif {numStrList[n][0]} not in dictionary[numStrList[n][1].split()[m]]:
                dictionary[numStrList[n][1].split()[m]]|{numStrList[n][0]} 
                m = m+1
        n = n+1                
return dictionary

它给了我这个错误

>>> makeInverseIndex(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./inverse_index_lab.py", line 23, in makeInverseIndex
    if numStrList[n][1].split()[m] not in dictionary: 
IndexError: list index out of range

没看懂。。。是什么原因?即使我更改了 while 循环的条件,它也会发生。我不明白有什么问题。我对此很陌生,所以请像一块西兰花问你这个问题一样解释它。

编辑:

谢谢大家,我忘了提到输入的例子,我想输入这样的东西:

 L=['A B C', 'B C E', 'A E', 'C D A']

并将其作为输出:

D={'A':{0,2,3}, 'B':{0,1}, 'C':{0,3}, 'D':{3}, 'E':{1,2}}

例如,要创建一个字典,显示在列表中您可能会找到“A”的位置。它应该与一个巨大的列表一起工作。有没有人有任何提示?我希望它迭代并挑选出每个字母,然后为它们分配一个字典值。

编辑二:

感谢你们的大力帮助,我的代码看起来很漂亮,如下所示:

def makeInverseIndex(strList):
numStrList = list(enumerate(strList))
n = 0
dictionary = {}
while (n < len(strList)):
    for word in numStrList[n][1].split():
        if word not in dictionary:
            dictionary[word] = {numStrList[n][0]}
        elif {numStrList[n][0]} not in dictionary[word]:
            dictionary[word]|={numStrList[n][0]} 
    n = n+1                     

return dictionary

但是当我尝试运行模块时,我仍然设法得到这个错误:

   >>> makeInverseIndex(L)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./inverse_index_lab.py", line 21, in makeInverseIndex
    for word in numStrList[n][1].split():
NameError: global name 'StrList' is not defined

我看不出错误来自哪里。

4

3 回答 3

4

很高兴看到一些智能蔬菜编程。

首先,你的问题。就像@Vasiliy 所说,你有 3 个索引。n没关系,因为你用你的条件保护它while1很好,因为总是enumerate产生两件事。就这样离开了m。这是你的问题。

假设您Nstrlist. 对于 中的每个元素estrlistsplit()都对其应用。中的元素数e.split()并不总是等于N。while 条件用于m防范N,而不是反对len(e.split()),因此索引超出范围。

为了解决这个问题,首先拆分字符串,然后循环遍历它。当您使用它时,不妨完全摆脱,m只将字符串拆分一次,并获得一些性能。另外,您永远不会重置您的m,它只会不断增长。

while (n < len(strList)):
    for word in numStrList[n][1].split():
        if word not in dictionary:
            dictionary[word] = {numStrList[n][0]}
        elif {numStrList[n][0]} not in dictionary[word]:
            dictionary[word]|={numStrList[n][0]} 
    n = n+1         

第二,你的while条件太严格了。n < len(strlist)很好。

于 2013-07-05T01:07:09.680 回答
1

我没有足够的声誉对您的帖子发表评论,所以我在这里发布答案:

我在底部复制并粘贴了最新的代码(编辑 2),它按预期运行,所以我可以看到两个潜在的问题:

1) 您可能忘记缩进您的函数定义 2) 您可能在函数定义中将 strList 大写为 StrList,然后在其他地方声明 StrList。

希望这可以帮助。

于 2013-07-05T06:18:48.957 回答
0

如果您想防范此错误,您也可以随时执行此类操作。

try:
    #The code that causes the issue
except IndexError:
    pass
于 2018-05-09T18:44:40.063 回答