[英]Replace all lines containing a certain character with elements from a list, iterating through each element for each line in input
[英]Removing Line From Python List - All Lines Containing Certain Number
我正在尋找從第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]
或者,使用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
方法的更詳細的等效方法。
我認為問題出在您的循環中,從而消除了以下幾行:
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
, d for d in all_decisions if d[4] != 0
可以d for d in all_decisions if d[4] != 0
使用生成器表達式d for d in all_decisions if d[4] != 0
來替換過濾循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.