2014-09-20 45 views
0

我想删除不匹配给定正则表达式的列表中的所有元素。我使用下面的代码:列表元素与奇数索引跳过迭代,为什么?

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

您正在修改循环中的列表。不建议这样做,如有必要,需要仔细调试。 – simonzack 2014-09-20 11:06:21

回答

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) 
相关问题