删除2d列表中的所需列表

问题描述 投票:2回答:5

说我有这样的2d列表:

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]]成为我的最终名单。

python
5个回答
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]]

一般来说,在inbuilts(list)之后命名变量并不是一个好主意,因为你会影响那些内置的。

此外,正如其他人所指出的那样,你的原始问题是在迭代它时改变list


1
投票

使用list理解:

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

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]]

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]
    else:
        i += 1

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


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]]
© www.soinside.com 2019 - 2024. All rights reserved.