列表删除时的冲突应该没有

时间:2017-04-15 02:04:45

标签: python list

所以我有一段代码从一个大列表中将两个单词放入一个数据库中,然后从列表中删除这两个单词,这样就不再使用了。当列表几乎结束时,它将被传递给一个不相关的函数。

def db_add(words):
    for i in words:
        choice = randint(2, 9)
        if len(words) < choice:
            finish(words)
        else:
            cursor.execute(
                'INSERT INTO swaps (word1, word2) VALUES (%s, %s);', (i, words[choice])
            )
            conn.commit()
            words.remove(words[choice])
            words.remove(i)

现在,由于无法从列表中删除i,因此通常会提前失败。使用一些打印语句我发现当iwords[choice]以某种方式最终成为相同的单词时发生这种情况。但由于选择从不为0,因此我看不出iwords[choice]如何相等。

我唯一的猜测是,它与在for语句中使用时操作列表有关,或者这是我正在犯的一个非常愚蠢的错误,但我真的不知道。

1 个答案:

答案 0 :(得分:1)

您正在迭代它时修改列表。这不可避免地导致问题。如果您需要从列表中删除元素,建议您复制列表,从副本中删除单词,然后返回副本。

def db_add(words):
    words_copy = words.copy()
    for i in words:
        choice = randint(2, 9)
        if len(words) < choice:
            finish(words)
        else:
            cursor.execute(
                'INSERT INTO swaps (word1, word2) VALUES (%s, %s);', (i, words[choice])
            )
            conn.commit()
            words_copy.remove(words_copy[choice])
            words_copy.remove(i)