2014-02-05 64 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來替換您的過濾循環。

相關問題