这是我的代码块。 “有效”是数字值的列表,如果正则表达式确实找到匹配项,则此代码段应删除测试中的元素。问题是,根据是否运行“对于每个有效”和“对于每个有效[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])
答案 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)
如果valid
是list
,则valid[:]
(或valid[0:]
是该列表的副本。
在循环过程中对其进行突变时,需要遍历列表的副本。例如,当您添加或删除元素时。
如果您不使用副本,则迭代器可能会丢失并丢失某些元素。
如果您要进行区分,可以写:
invalid = list(filter(lambda i: not regexDupes.findall(str(i)), valid))
valid = list(filter(lambda i: regexDupes.findall(str(i)), valid))