Python - 从没有numPy的矩阵中删除列

时间:2012-07-01 07:52:55

标签: python

这是我在这里的第一个问题。问题很简单 -

# this removes the top list from the list of lists
triangle = [
[3, 0, 0],
[2, 0, 0],
[1, 0, 0]]
del triangle[0]

我希望有一种类似的简单方法来删除“列”。我当然可以使用for循环来做这件事,但有些东西等同于

del triangle[0]

三江源

2 个答案:

答案 0 :(得分:4)

如果您想在不复制整个列表的情况下到位,那么

all(map(lambda x: x.pop(which_column), triangle))

EDIT。是的,如果列中有0,则它将无效,只需使用任何其他累加器函数

sum(map(lambda x: x.pop(which_column), triangle))

for python 2其中map不是迭代器累加器:

map(lambda x: x.pop(1), triangle)

作为副作用,返回您可能使用的已删除列

deleted_column = list(map(lambda x: x.pop(which_column), triangle))

(对于python 2 list()不需要包装器)

较短的表格是

sum(i.pop(which_column) for i in triangle)

deleted_column = [i.pop(which_column) for i in triangle]

虽然我不确定它是否符合“没有for loop”的要求

P.S。在官方Python文档中,他们使用0-lenqth deque来使用迭代器,如下所示:

collections.deque(map(lambda x: x.pop(which_column), triangle), maxlen=0)

我不知道它是否比sum()好,但它可以用于非数字数据

答案 1 :(得分:2)

一种方法是使用zip()转置矩阵,删除目标行,然后将其压缩回来:

>>> def delcolumn(mat, i):
        m = zip(*mat)
        del m[i]
        return zip(*m)

>>> triangle = delcolumn(triangle, 1)
>>> pprint(triangle, width=20)
[(3, 0),
 (2, 0),
 (1, 0)]

另一种方法是使用list comprehensionsslicing

>>> def delcolumn(mat, i):
        return [row[:i] + row[i+1:] for row in mat]

>>> triangle = delcolumn(triangle, 1)
>>> pprint(triangle, width=20)
[(3, 0),
 (2, 0),
 (1, 0)]

最后一种技术是使用 del

就地改变矩阵
>>> def delcolumn(mat, i):
         for row in mat:
             del row[i]