说我有一个二维列表,像这样:
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]]
是我的最终清单。
答案 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
答案 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]]