说我有这样的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]]
成为我的最终名单。
使用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
。
使用list
理解:
[x for x in my_list if x[0] != 'a']
您也可以使用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]]
发生的事情是,当您从中删除项目时,您的列表长度会变短。它仍将尝试在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
使用过滤器的方法怎么样?此外,我将您的列表重命名为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]]