Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “与”的区别是什么;对于列表中的每一个“;及;对于列表[0:]中的每一个;_Python_List_For Loop - Fatal编程技术网

Python “与”的区别是什么;对于列表中的每一个“;及;对于列表[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

这是我的代码块。“valid”是一个数值列表,如果正则表达式确实找到匹配项,则此代码段应该删除测试中的元素。问题是,根据我是否运行“For each in valid”和“For each in valid[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])
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
,或者其他技巧,但这并不值得。