这是我在这里的第一个问题。问题很简单——
# 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]
谢谢
这是我在这里的第一个问题。问题很简单——
# 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]
谢谢
如果您想在不复制整个列表的情况下就地执行此操作,那么类似
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()好,但是可以用于非数值数据
一种方法是使用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]