“对于列表中的每个”和“对于列表中的每个[0:]”有什么区别

时间:2019-12-08 14:31:39

标签: python list for-loop

这是我的代码块。 “有效”是数字值的列表,如果正则表达式确实找到匹配项,则此代码段应删除测试中的元素。问题是,根据是否运行“对于每个有效”和“对于每个有效[0:]”,我得到不同的结果。我不明白为什么这两个行为会有所不同。

regexDupes = re.compile(r'(.)\1+')
for each in valid[0:]: ####<<<<<<<PROBLEM IS HERE
    qtyTest = regexDupes.findall(str(each))
    if len(qtyTest) == 0:
        valid.remove(each)
        print(each)
        invalid.append(each)

print(len(valid), len(invalid))

print(valid[0:25])

2 个答案:

答案 0 :(得分:0)

您不得遍历要修改的列表。因此,您必须复制列表,或者更好的是,不要修改列表,而要生成新列表:

regexDupes = re.compile(r'(.)\1+')
modified_valid = []
for each in valid:
    qtyTest = regexDupes.findall(str(each))
    if len(qtyTest) == 0:
        print(each)
        invalid.append(each)
    else:
        modified_valid.append(each)

print(len(modified_valid), len(invalid))

print(modified_valid[0:25])

答案 1 :(得分:-1)

如果validlist,则valid[:](或valid[0:]是该列表的副本。

在循环过程中对其进行突变时,需要遍历列表的副本。例如,当您添加或删除元素时。

如果您不使用副本,则迭代器可能会丢失并丢失某些元素。

如果您要进行区分,可以写:

invalid = list(filter(lambda i: not regexDupes.findall(str(i)), valid))
valid = list(filter(lambda i: regexDupes.findall(str(i)), valid))