列表元素与奇数索引跳过迭代,为什么?

时间:2014-09-20 11:04:28

标签: python list for-loop

我正在尝试删除列表中与给定正则表达式不匹配的所有元素。我使用以下代码:

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"]

似乎奇数索引的项目以某种方式跳过迭代(skipPSJAI12345匹配正则表达式时不会被打印)。我不明白为什么。请有人解释一下这里发生了什么。

1 个答案:

答案 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)