从Python列表中删除行-包含特定编号的所有行

从Python列表中删除行-包含特定编号的所有行,python,list,file-io,Python,List,File Io,我希望从列表中删除第4个位置为0的行。当我现在写这个文件时,它并没有删除所有的零行 counter = 0 for j in all_decisions: if all_decisions[counter][4] == 0: all_decisions.remove(j) counter += 1 ofile = open("non_zero_decisions1.csv","a") writer = csv.writer(ofile, delimiter='

我希望从列表中删除第4个位置为0的行。当我现在写这个文件时,它并没有删除所有的零行

counter = 0
for j in all_decisions:
    if all_decisions[counter][4] == 0:
        all_decisions.remove(j)
    counter += 1

ofile = open("non_zero_decisions1.csv","a")

writer = csv.writer(ofile, delimiter=',')

for each in all_decisions:
    writer.writerow(each)

ofile.close()

使用列表理解

all_decisions = [x for x in all_decisions if x[4] != 0]
或者,使用
过滤器

all_decisions = filter(lambda x: x[4] != 0, all_decisions)
这样做不是一个好主意,因为在迭代过程中,您正在修改所有决策。如果您想在循环中执行此操作,我建议您执行以下操作:

temp = []
for x in all_decisions:
    if x[4] != 0:
        temp.append(x)
all_decisions = temp

但这基本上只是我在上面展示的列表理解和过滤方法的一个更详细的等价物。

我认为问题在于你的循环中消除了行:

counter = 0
for j in all_decisions:
    if all_decisions[counter][4] == 0:
        all_decisions.remove(j)
    counter += 1
如果删除元素,也会碰撞计数器。这样做的结果就是你在跳绳。因此,您可能会错过要删除的行。如果没有移除某个元素,请仅尝试碰撞计数器,即

counter = 0
for j in all_decisions:
    if all_decisions[counter][4] == 0:
        all_decisions.remove(j)
    else:
        counter += 1
也就是说,做你想做的事情的更简洁的方法是

with open("non_zero_decisions1.csv","a") as ofile:
  writer = csv.writer(ofile, delimiter=',')
  writer.writerows(d for d in all_decisions if d[4] != 0)
执行代码后,
with
子句将负责在
ofile
上调用
close
,即使引发异常也是如此。另外,
csv.writer
具有一个
writerows
方法,该方法获取行列表。第三,如果d[4]!=0
以替换筛选循环