我正在尝试编写一个遍历矩阵(数组数组)的函数,并删除其中包含一个特定值的所有行。作为一个例子,我的矩阵看起来像这样:
a = [[[1,2,3], [1,3,2], [0,2], 0, True],
[[2,1,3], [1,3,2], [4,3], 2, False],
[[4,3,1], [9,2,1], [5,2], 1, True],
[[3,1,4], [5,2,1], [5,4], 2, False]]
我想删除最后一列中包含False的所有行,以便我最终得到:
a = [[[1,2,3], [1,3,2], [0,2], 0, True],
[[4,3,1], [9,2,1], [5,2], 1, True]]
我尝试过这个:
def rmRows(a):
for i in range(len(a)-1):
if a[i][4] == False:
a.remove(a[i])
return a
但这似乎不起作用。关于如何解决的任何想法?
答案 0 :(得分:3)
一个简单的列表理解就可以帮到你了
>>> [elem for elem in a if elem[-1] == True]
[[[1, 2, 3], [1, 3, 2], [0, 2], 0, True], [[4, 3, 1], [9, 2, 1], [5, 2], 1, True]]
现在反映回你的代码,它不起作用的原因是因为你在迭代时改变了序列。每次改变列表时,迭代器都会通过跳过元素来假设指向下一个元素。
关于这种行为,关于SO的一些优秀答案已经很少有问题。
参考:Remove items from a list while iterating in Python
参考:Python: removing items from inner and outer for loop iterators
答案 1 :(得分:0)
不要改变列表,而只是在必要时添加,所以请恭维你的布尔表达式并重写你的函数:
a = [[[1,2,3], [1,3,2], [0,2], 0, True], [[2,1,3], [1,3,2], [4,3], 2, False], [[4,3,1], [9,2,1], [5,2], 1, True], [[3,1,4], [5,2,1], [5,4], 2, False]]
def rmRows(a):
b = []
for row in a:
if row[-1] == True:
b.append(row)
return b
print rmRows(a)
给出:
[[[1, 2, 3], [1, 3, 2], [0, 2], 0, True], [[4, 3, 1], [9, 2, 1], [5, 2], 1, True]]