如果内部列表中的第一个元素满足特定条件,我正在试图弄清楚如何删除特定索引处的整个列表。下面我展示了我想要做的一个例子,但是当我运行代码时,我在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中运行示例代码时会发生什么情况的图片,第一次运行循环时它会出错,但第二次运行代码(复制并粘贴两次)它没有这就是我要问的问题。
答案 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)