混淆了简单的Python循环输出

时间:2014-11-13 16:46:45

标签: python

我有一个项目列表,并希望删除包含数字16的所有项目(此处为字符串,ind =' 16')。该列表有六个项目,其中包含' 16'然而我的循环始终只删除其中的五个。困惑(我甚至在两台独立的机器上运行它)!

lines=['18\t4', '8\t5', '16\t5', '19\t6', '15\t7', '5\t8', '16\t8', '21\t8', '20\t12', '22\t13', '7\t15', '5\t16', '8\t16', '21\t16', '4\t18', '6\t19', '12\t20', '8\t21', '16\t21', '13\t22']

ind='16'

for query in lines:
    if ind in query:
        lines.remove(query)

随后,输入“' line'给了我:[' 18 \ t4',' 8 \ t5',' 19 \ t6',' 15 \ t7',&# 39; 5 \ t8',' 21 \ t8',' 20 \ t12',' 22 \ t13',' 7 \ t15&# 39;,' 8 \ t16 ',' 4 \ t18',' 6 \ t19',' 12 \ t20',' 8 \ t21',' 13 \ t22']

即。项目' 8 \ t16'仍在列表中???

谢谢

克里夫

2 个答案:

答案 0 :(得分:2)

修改正在迭代的列表是个坏主意,因为删除项可能会混淆迭代器。您的示例可以使用简单的列表推导来处理,只需创建一个新列表即可分配给原始名称。

lines = [query for query in lines if ind not in query]

或者,使用filter功能:

# In Python 2, you can omit the list() wrapper
lines = list(filter(lambda x: ind not in x, lines))

答案 1 :(得分:1)

注意:永远不要在循环时修改列表

lines=['18\t4', '8\t5', '16\t5', '19\t6', '15\t7', '5\t8', '16\t8', '21\t8', '20\t12', '22\t13', '7\t15', '5\t16', '8\t16', '21\t16', '4\t18', '6\t19', '12\t20', '8\t21', '16\t21', '13\t22']
ind = '16'
new_lines = [ x  for x in lines if ind not in x ]