1

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

# 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]

谢谢

4

2 回答 2

4

如果您想在不复制整个列表的情况下就地执行此操作,那么类似

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

编辑。是的,如果列中有0,它将不起作用,只需使用任何其他累加器功能

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

对于map不需要迭代器累加器的python 2:

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 循环”的条件

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

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

不知道是不是比sum()好,但是可以用于非数值数据

于 2012-07-01T08:09:51.443 回答
3

一种方法是使用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)]

另一种方法是使用列表推导切片

>>> 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]
于 2012-07-01T07:57:40.963 回答