我正在尝试删除列表中与给定正则表达式不匹配的所有元素。我使用以下代码:
import json
import re
skus = [u'12', u'344', u'56', u'PSJAI12345', u'57']
pattern = re.compile('([A-Z]{5})(\d{5})')
for sku in skus:
if pattern.match(sku):
print("skip")
else:
skus.remove(sku)
print json.dumps(skus)
输出结果为:
["344", "PSJAI12345"]
预期产出为:
["PSJAI12345"]
似乎奇数索引的项目以某种方式跳过迭代(skip
在PSJAI12345
匹配正则表达式时不会被打印)。我不明白为什么。请有人解释一下这里发生了什么。
答案 0 :(得分:1)
在您重复迭代时,不要修改序列/映射。
这是使用列表理解的替代方法(而不是修改列表,返回新列表):
import re
import json
skus = [u'12', u'344', u'56', u'PSJAI12345', u'57']
pattern = re.compile('([A-Z]{5})(\d{5})')
skus = [sku for sku in skus if pattern.match(sku)] # OR skus[:] = ...
print json.dumps(skus)
输出:
["PSJAI12345"]
或者,迭代原始列表的副本(但不建议这样做,因为remove
从头开始搜索元素,所以它很慢。)
for sku in skus[:]:
if pattern.match(sku):
print("skip")
else:
skus.remove(sku)