删除二维列表中的所需列表

时间:2019-03-20 22:43:18

标签: python

说我有一个二维列表,像这样:

list = [[1, 2, 3], ["a", 5, 6], [7, 8, 9], [10, 11, 12]]

,我想删除一个以a开头的列表。这是我尝试过的:

for i in range(0, len(list)):
     if list[i][0] == "a":
          list.pop(i)

在这里,我正在尝试删除以a开头的列表。但是,它给我一个错误提示

  

IndexError:列表索引超出范围

我不确定这是什么问题。这很奇怪,因为当我尝试print(list[i])时,它会打印出匹配的行,即'[“ a”,2,3]。

我希望list = [[1, 2, 3], [7, 8, 9], [10, 11, 12]]是我的最终清单。

5 个答案:

答案 0 :(得分:8)

使用 list理解

>>> l = [[1, 2, 3], ["a", 5, 6], [7, 8, 9], [10, 11, 12]]
>>> new_l = [sublist for sublist in l if sublist[0] != 'a']
>>> new_l
[[1, 2, 3], [7, 8, 9], [10, 11, 12]]

通常,在内置变量(list之后命名变量不是一个好主意,因为您将隐藏这些内置变量。

而且,正如其他人所指出的那样,您最初的问题是在迭代list时对其进行了突变。

答案 1 :(得分:1)

使用list理解:

[x for x in my_list if x[0] != 'a']

答案 2 :(得分:1)

正在发生的事情是,当您从列表中删除项目时,列表长度会变短。仍然会尝试在i = 3处循环。

您可以改用while循环,因为它每次都会检查。另外,由于您没有使用弹出的值,因此请使用del

list = [[1, 2, 3], ["a", 5, 6], [7, 8, 9], [10, 11, 12]]
i = 0
while i < len(list):
    if list[i][0] == "a":
        del list[i]
    i += 1

相关:Difference between del, remove and pop on lists

答案 3 :(得分:1)

您也可以使用filter

li = [[1, 2, 3], ["a", 5, 6], [7, 8, 9], [10, 11, 12]]

#Filter on first element not being equal to a
res = filter(lambda x: x[0] != 'a', li)

#Print the result
print(list(res))
#[[1, 2, 3], [7, 8, 9], [10, 11, 12]]

答案 4 :(得分:0)

使用过滤器的方法怎么样?另外,我将您的列表重命名为l,这样您就不会覆盖内置数据类型。

from operator import itemgetter

f = itemgetter(0)

def test(sublist):
    return f(sublist) != 'a'

list(filter(test, l))

[[1, 2, 3], [7, 8, 9], [10, 11, 12]]