2014-02-05 66 views
0

我正在寻找删除列表中第4个位置有0的行。当我现在写出这个文件时,它并不会影响所有的零线。从Python列表中删除行 - 包含某些数字的所有行

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() 

回答

5

使用列表理解。或者使用filter

all_decisions = filter(lambda x: x[4] != 0, all_decisions) 

的方式你这样做是不是一个好主意,因为你正在修改all_decisions当你迭代它。如果你想这样做在一个循环,我建议是这样的:

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

但是,这基本上是一个列表理解和filter方法我上面显示的更详细的等价物。

+0

完美的作品,谢谢你senshin! – user2512696

2

我认为这个问题是在循环,消除线路:

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 for d in all_decisions if d[4] != 0来替换您的过滤循环。

相关问题