Python:IndexError:列表索引超出范围错误

时间:2013-07-05 00:08:33

标签: python list python-3.x

已更新,请查看底部!

我被卡住了!我得到一个IndexError:list index超出范围错误。

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

我看不出错误的来源。

3 个答案:

答案 0 :(得分:4)

很高兴看到一些聪明的蔬菜编程。

首先,你的问题。就像@Vasiliy所说,你有3个指数。 n没问题,因为您使用while条件保护它。 1很好,因为enumerate总是生成两件事。那就是m。这是你的问题。

假设您在N中有strlist个元素。对于e中的每个元素strlist,您都应用split()e.split()中的元素数量并不总是等于Nm的while条件防范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)没问题。

答案 1 :(得分:1)

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

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

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

希望这有帮助。

答案 2 :(得分:0)

如果你想防止这个错误,你也可以做这样的事情。

$.ajax({        
            url : url,

            type:"get",     
            contentType:'application/json; charset=utf-8',  
            dataType: 'json' ,
            async: false,  
            success:function(response) 
            {     
                alert(response.data);  

                  $('#countryTable').DataTable( {
                        "fnRowCallback" : function(nRow, aData, iDisplayIndex){
                            $("td:first", nRow).html(iDisplayIndex +1);
                           return nRow;
                        },
                         destroy: true,
                        mydata: response.data, 
                        columns: [     
                             { mydata:'countryId'},   
                             { mydata:'countryName'},
                             { mydata:'countryShortCode'}     


                        ]  
                    } );         

                console.log(response);
            }
        });