Python “与”的区别是什么;对于列表中的每一个“;及;对于列表[0:]中的每一个;
这是我的代码块。“valid”是一个数值列表,如果正则表达式确实找到匹配项,则此代码段应该删除测试中的元素。问题是,根据我是否运行“For each in valid”和“For each in valid[0:]”,我得到了不同的结果。我不明白为什么这两个人的行为会不同Python “与”的区别是什么;对于列表中的每一个“;及;对于列表[0:]中的每一个;,python,list,for-loop,Python,List,For Loop,这是我的代码块。“valid”是一个数值列表,如果正则表达式确实找到匹配项,则此代码段应该删除测试中的元素。问题是,根据我是否运行“For each in valid”和“For each in valid[0:]”,我得到了不同的结果。我不明白为什么这两个人的行为会不同 regexDupes = re.compile(r'(.)\1+') for each in valid[0:]: ####<<<<<<<PROBLEM IS HERE qty
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])
regexDupes=re.compile(r'()\1+)
对于有效[0:]:#####中的每一个,如果有效
是一个列表
,则有效[:]
(或有效[0:]
是该列表的副本
当您在循环过程中对列表进行变异时,需要对列表的副本进行迭代。例如,当您添加或删除元素时
如果不使用副本,迭代器可能会丢失并丢失某些元素
如果你想进行歧视,你可以写:
invalid = list(filter(lambda i: not regexDupes.findall(str(i)), valid))
valid = list(filter(lambda i: regexDupes.findall(str(i)), valid))
您不能对要修改的列表进行迭代。因此,您必须复制列表,或者最好不要修改列表,而是生成新列表:
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])
list[0://code>是列表的浅表副本,因此您的结果不同,因为这样您就不会更改正在迭代的内容的长度。将其重写为列表理解会更清楚。您需要保持无效的出于什么目的?您可以用函数f(每个)替换For循环中的行
返回一个元组(有效项,无效项)
。然后用valid,invalid=zip调用它(每个有效项对应f)
@Daniel,在大多数情况下,它是(短列表)因为短代码是可维护的。当然,您可以使用带有两个变量的循环,一个collections.Counter
,或者其他技巧,但这并不值得。