这是我在这里的第一个问题。问题很简单 -
# 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]
三江源
答案 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 comprehensions和slicing:
>>> 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]