簡體   English   中英

Python:從列表列表中刪除列表

[英]Python : remove list from list of list

在 python 中有如下所示的列表:

list1 = [['BF001', '26-OCT-2020', '6167', '1', '07:35'],\   
 ['Summary', '26-OCT-2020', '', '', '', ''],\   
 ['BF004', '26-OCT-2020', '327', '2', '08:25'],\  
 ['Summary', '26-OCT-2020', '', '', '', '' ],\  
 ['BF005', '26-OCT-2020', '26983', '3', '07:40'],\  
['BF005', '26-OCT-2020', '26983', '3', '07:40'],\  
['BF005', '26-OCT-2020', '26983', '3', '07:40']]   

我需要刪除第一個元素為“摘要”的子列表。 我嘗試了以下代碼:

for i in range(len(list1)):  
  if list1[i][0]=='Summary':  
    list1.pop[i]

但我收到索引超出范圍錯誤。

您在迭代列表時正在修改列表。 那將無法按預期工作。

你可以做的是使用列表理解:

lst = [item for item in list1 if item[0] != 'Summary']

你也可以直接改變你當前的列表:

list1[:] = [item for item in list1 if item[0] != 'Summary']

你最好使用一個新列表:

new_list2 = []
for i in range(len(list1)):
  if list1[i][0] != 'Summary':
    new_list2.append(list1[i])

或者,通過列表理解:

new_list2 = [l for l in list1 if l[0] != 'Summary']

每次pop后,列表的長度都會發生變化。 所以第二個pop將有一個較短的列表,最終pop的參數對於剩余的列表來說可能太大了。

如果你需要就地修改,你可以反向迭代列表來防止這個問題:

for i in range(len(list1)-1, -1, -1):
    if list1[i][0] == 'Summary':
        list1.pop(i)

您甚至可以在通過理解遍歷列表的同時修改列表:

list1 = [x for x in list1 if not x[0] == 'Summary']

您可以直接遍歷項目並通過索引方法彈出,如下所示:

for l in list1:
    if l[0] == 'Summary':
        list1.pop(list1.index(l))

但是,如果有多個摘要,這將不起作用。 正如其他人提到的,這是因為當您彈出一個項目時索引會發生變化。

因此,最好的方法是使用列表理解並創建一個包含所有不是摘要的項目的新列表。 它甚至可以有相同的變量名:

list1 = [item for item in list1 if item[0] != 'Summary']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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