簡體   English   中英

從Python列表中刪除行-所有包含特定數字的行

[英]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] != 0d 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM