扭曲在python中迭代时从列表中删除项

扭曲在python中迭代时从列表中删除项,python,iteration,Python,Iteration,我知道关于这个话题有很多类似的问题,我已经做了足够多的研究,让我觉得这个问题的转折点还没有被讨论过,或者只是很难找到。我理解,除非使用某种副本或其他方法,否则不能从正在迭代的列表中删除项目。我所遇到的例子 list=[1,2,3,4,5,6,7,8,9,10] for x in list[:]: if x==3: list.remove(x) list.remove(7) 这将从列表中删除3和7。但是,如果我有以下情况怎么办: for x in lis

我知道关于这个话题有很多类似的问题,我已经做了足够多的研究,让我觉得这个问题的转折点还没有被讨论过,或者只是很难找到。我理解,除非使用某种副本或其他方法,否则不能从正在迭代的列表中删除项目。我所遇到的例子

list=[1,2,3,4,5,6,7,8,9,10]

for x in list[:]:
    if x==3:
        list.remove(x)
        list.remove(7)
这将从列表中删除3和7。但是,如果我有以下情况怎么办:

for x in list[:]:
    if x==3:
        list.remove(x)
        list.remove(7)
    if x==7:
        list.remove(9)

此迭代将删除3、7和9。因为7“应该”已经从之前的迭代中删除了,所以我实际上不想删除9(因为列表中不应该再有7)。有没有办法做到这一点

请记住,您正在从原始列表中删除并迭代副本。副本中仍然包含7,因此9也将被删除。

您可以在if语句中添加另一个检查: 如果x==7且列表中的x为: 列表。删除(9)

尝试此操作

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for x in list1:
    if x == 3:
        list1.remove(x)
        list1.remove(7)
    if x == 7:
        list1.remove(9)
print list1

Output: [1, 2, 4, 5, 6, 8, 9, 10]

您可以在同一个列表上工作,而不是迭代新的列表。

您真正想解决的问题是什么,您找到了这个可能的解决方案?@Code peedient嗯,我正在尝试遍历一个单词列表,每个单词对象都有与其相关联的同义词。我想根据这个算法对单词进行分组,但一旦我创建了一个组,我就不想再看到那些单词(及其相关的同义词)。本质上,我想通过某种迭代来划分我的结果?这有意义吗?所以我想我的问题是,我怎样才能做我想做的事?根据你的回答,我认为复制不是最好的选择,那又是什么呢?哇,这太简单了,而且似乎很有效。在我看来,列表中的这两条语句
x==7
x
基本上是相同的,但我猜它们不是一样的?这是因为,正如code Peedient指出的,您正在迭代原始列表的副本。在list2:#等中为x编写list2=list[:]可能不会那么混乱