已更新,请查看底部!
我被卡住了!我得到一个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
我看不出错误的来源。
答案 0 :(得分:4)
很高兴看到一些聪明的蔬菜编程。
首先,你的问题。就像@Vasiliy所说,你有3个指数。 n
没问题,因为您使用while
条件保护它。 1
很好,因为enumerate
总是生成两件事。那就是m
。这是你的问题。
假设您在N
中有strlist
个元素。对于e
中的每个元素strlist
,您都应用split()
。 e.split()
中的元素数量并不总是等于N
。 m
的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);
}
});