如何删除特定索引处的列表列表

时间:2017-01-28 20:26:33

标签: python list

如果内部列表中的第一个元素满足特定条件,我正在试图弄清楚如何删除特定索引处的整个列表。下面我展示了我想要做的一个例子,但是当我运行代码时,我在python中得到一个列表索引超出范围错误。如果列表[i] [0]满足某个条件,我希望从整个列表中删除整个列表。

list = [[0, 0, 0], [1, 1, 1], [2, 2, 2]]

for i in range(0, len(list)):
  if list[i][0] == 0:
    del list[i]

return list

下面我展示了当我在IDLE中运行示例代码时会发生什么情况的图片,第一次运行循环时它会出错,但第二次运行代码(复制并粘贴两次)它没有这就是我要问的问题。

Weird Python Error

5 个答案:

答案 0 :(得分:2)

从列表中间删除元素可以减少所有内容,从而破坏索引。您需要从末尾删除元素:

for i in range(len(lst)-1, -1, -1):
    if lst[i][0] == 0:
        del lst[i]

或构建一个新列表并将其分配回变量,这也会更有效:

lst = [x for x in lst if x[0] != 0]

答案 1 :(得分:1)

尝试将您的代码更改为此,并列出'不是一个好的变量名,因为它已经是一个内置函数:

my_list = [[0, 0, 0], [1, 1, 1], [2, 2, 2]]
my_list = [l for l in list if l[0] != 0]
print(my_list)

答案 2 :(得分:1)

通常从列表中删除元素并不是一个好主意,因为第一次删除元素时列表将不再具有相同的长度。

1)创建一个全新的列表,其中包含您要保留的元素:

listname = [element for element in listname if element[0] != 0]

2)修改你已经拥有的列表(你可以这样做,因为列表是可变的):

listname[:] = [element for element in listname if element[0] != 0]

如果您在程序中的其他位置引用了相同的列表,我建议您使用第二种方法。

另外,尽量不要为你的变量列表命名,它实际上不是一个好的做法,因为它是关键词,所以它可能是不可能的。

答案 3 :(得分:0)

首先,不要永远调用变量list

其次,while循环可能是一个更好的解决方案:

stop = range(len(mylist))
i = 0
while i < stop: 
  if mylist[i][0] == 0:
    del mylist[i]
    stop -= 1
  else:
    i += 1

第三,列表理解更好:

[item for item in mylist if item[0] != 0]

答案 4 :(得分:0)

在迭代容器时从容器中删除元素总是坏主意。

更好的方法是不要从列表中删除坏元素,而是将好的元素复制到新列表中:

original = [[0, 0, 0], [1, 1, 1], [2, 2, 2]]
new_list = []

for l in original:
  if list[0] != 0:
    new_list.append(l)

return new_list

顺便说一下,&#34; list&#34;是一个python关键字,不能用作变量名。

或者更好,使用内置过滤功能:

return filter(lambda l : l[0] != 0, original)