我有一个项目列表,并希望删除包含数字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'仍在列表中???
谢谢
克里夫
答案 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 ]