首页 > 解决方案 > 遍历列表时使索引超出范围

问题描述

我写了一个完美运行的机器学习算法,现在我必须迭代列表中的所有项目以生成 0.01 到 1.00 之间的相似性标记。这是代码

    temp[]
    start_node = 0
    end_node = 0
    length = len(temp)
    for start_node in range(length):
        doc1 = nlp(temp[start_node])
        for end_node in range(++start_node, length):
            doc2 = nlp(temp[end_node])
            similar = doc1.similarity(doc2)
            exp_value = float(0.85)
            if similar == 1.0:
                print("Exact match", similar, temp[end_node], "---------||---------",  temp[start_node])
            elif 0.96 < similar < 0.99:
                print("possible match", similar, temp[end_node], "---------||---------", temp[start_node])
                temp.remove(temp[end_node])

在这里,我试图检查列表中的所有其他项目是否有任何项目相似,然后从列表中删除该项目,因为再次检查句子与其他元素的相似性没有任何好处,这将浪费计算能力。但是当我试图弹出元素时,我得到了索引错误。

<ipython-input-12-c1959947bdd1> in <module>
      4 length = len(temp)
      5 for start_node in range(length):
----> 6     doc1 = nlp(temp[start_node])
      7     for end_node in range(++start_node, length):
      8         doc2 = nlp(temp[end_node])

我只是想保留原始句子,删除列表中所有相似的句子,这样它就不会检查这些项目。

临时列表有 351 项,这里我只是作为列表引用。

在这里;对其进行测试

print(temp[:1])

['malicious: caliche development partners "financial statement"has been shared with you']

我尝试创建另一个重复列表并从该列表中删除类似项目

final_items = temp
start_node = 0
end_node = 0
length = len(temp)
for start_node in range(length):
    doc1 = nlp(temp[start_node])
    for end_node in range(++start_node, length):
        doc2 = nlp(temp[end_node])
        similar = doc1.similarity(doc2)
        exp_value = float(0.85)
        if similar == 1.0:
            print("Exact match", similar, temp[end_node], "---------||---------",  temp[start_node])
        elif 0.96 < similar < 0.99:
            print("possible match", similar, temp[end_node], "---------||---------", temp[start_node])
            final_items.remove(temp[end_node])

但是,当我从另一个列表中删除我什至没有迭代的元素时,仍然使相同的列表索引超出范围。

标签: pythonmachine-learningnlp

解决方案


我想你的问题出在这里。

temp.remove(temp[end_node])

您将删除列表中的项目temp,因此列表索引将超出范围。

假设开始temp包含 351 个项目,即索引 0 到 350。

现在,脚本将删除temp列表中的 1 个(或更多)项目。
突然temp列表将有 350 个项目,即索引 0 到 349。

但是,脚本仍然使用临时原始长度 351 进行迭代。
因此,当脚本到达最后一次迭代索引 350(或更早,如果删除了多个项目)时,交互将尝试获取不再存在的列表索引。

doc1 = nlp(temp[350])

由于此时temp列表索引为 0 到 349。

最好有一个额外的列表副本进行修改,而不是修改您迭代的列表。
如果您创建附加列表,请记住使用复制方法。

final_items = temp.copy()

由于常规分配将保留对temp列表的引用。
Python 文档 - 复制()


推荐阅读