我创建的函数中有一个非常奇怪的问题,该函数搜索类别中的单词,如果该单词不在其中,则删除该类别。出于某些非常神秘的原因,我总是会收到错误消息:
list index out of range
我了解此错误的含义,但我无法理解原因。 我的代码如下:
def check_cat(input, list_of_words, categories):
"""if a word is not in the possible set of words of a class, cannot be in this class"""
possible_cat = list_of_words
categories_copy = categories
for j in range(len(list_of_words)):
for i in input:
if i not in list_of_words[j][:,1]:
possible_cat.pop(j)
categories_copy = np.delete(categories_copy,j)
else:
pass
其中categories = array(['culture', 'politics', 'sports'], dtype='|S8')
和
list_of_words =
[array([['0.14285714285714285', 'ball'],
['0.2857142857142857', 'cart'],
['0.14285714285714285', 'drama'],
['0.14285714285714285', 'opera'],
['0.2857142857142857', 'theater']], dtype='|S32'),
array([['0.25', 'decision'],
['0.5', 'drama'],
['0.25', 'strategy']], dtype='|S32'),
array([['0.2857142857142857', 'ball'],
['0.14285714285714285', 'cart'],
['0.2857142857142857', 'goal'],
['0.14285714285714285', 'player'],
['0.14285714285714285', 'strategy']], dtype='|S32')]
我真正不了解的事情是,当我在功能/不具有功能的“外部”执行代码时,它可以工作。但是通过一个函数,我得到了错误:
File "<ipython-input-110-b499e8f5d937>", line 7, in check_cat
if i not in list_of_words[j][:,1]:
IndexError: list index out of range
在我看来,索引j在list_of_words的范围内,因为我在其中进行了循环...非常感谢您的帮助。
答案 0 :(得分:1)
我认为错误的根源在于变量分配。当您在函数内部分配两个变量时,您实际上并不是在创建副本,而是在创建指向原始Python对象的链接。因此,当您进行弹出操作时,实际上是在第一次读取len时减少了原始内容的长度,因此循环执行的次数超过了项目的数量。
这是很棒的article,它可以使我更深入地了解我的解释,这是您必须记住的一件事,以避免将来出现陷阱。
关于您的问题,我停止了错误更改并复制了输入内容,而不是使用.copy()
创建了对该错误的引用。
possible_cat = list_of_words.copy()
categories_copy = categories.copy()
希望这可以清除它,这就是您想要的。