如果显示特定值,则删除矩阵中的数组

时间:2014-11-03 19:31:27

标签: python arrays matrix

我正在尝试编写一个遍历矩阵(数组数组)的函数,并删除其中包含一个特定值的所有行。作为一个例子,我的矩阵看起来像这样:

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

但这似乎不起作用。关于如何解决的任何想法?

2 个答案:

答案 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]]