Python 如何在仍考虑其原始位置的情况下多次移动二维数组的列? 好的,请考虑我有一个矩阵 m ,如下: m = [[0, 1, 0, 0, 0, 1], [4, 0, 0, 3, 2, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]] m = [[1, 0, 0, 0, 1, 0], [0, 0, 3, 2, 0, 4], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
我的目标是检查矩阵的每一行,看那一行的和是否为零。如果总和不是零,我想将对应于该行的列移动到矩阵的末尾。如果行的和为零,则什么也不会发生。因此,在上述给定矩阵中,应出现以下情况:Python 如何在仍考虑其原始位置的情况下多次移动二维数组的列? 好的,请考虑我有一个矩阵 m ,如下: m = [[0, 1, 0, 0, 0, 1], [4, 0, 0, 3, 2, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]] m = [[1, 0, 0, 0, 1, 0], [0, 0, 3, 2, 0, 4], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]],python,python-2.7,matrix,multidimensional-array,Python,Python 2.7,Matrix,Multidimensional Array,我的目标是检查矩阵的每一行,看那一行的和是否为零。如果总和不是零,我想将对应于该行的列移动到矩阵的末尾。如果行的和为零,则什么也不会发生。因此,在上述给定矩阵中,应出现以下情况: 程序发现第0行的和不等于零 矩阵的第0列移到矩阵的末尾,如下所示: m = [[0, 1, 0, 0, 0, 1], [4, 0, 0, 3, 2, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0],
m = [[0, 1, 0, 0, 0, 1],
[4, 0, 0, 3, 2, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]
m = [[1, 0, 0, 0, 1, 0],
[0, 0, 3, 2, 0, 4],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]
m = [[0, 0, 0, 1, 0, 1],
[0, 3, 2, 0, 4, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]
我不能使用
numpy
来解决这个问题,因为我只能使用原始的Python 2库。使用一个简单的循环,当总和不等于零时,再次循环行,并将弹出的第一项附加到每行
>>> from pprint import pprint
>>> m = [[0, 1, 0, 0, 0, 1],
[4, 0, 0, 3, 2, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]
>>> for row in m:
# If all numbers are >= 0 then we can short-circuit this using `if any(row):`.
if sum(row) != 0:
for row in m:
row.append(row.pop(0))
...
>>> pprint(m)
[[0, 0, 0, 1, 0, 1],
[0, 3, 2, 0, 4, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]
list.pop
是,如果您需要快速操作,请使用。deque
可以旋转元素
from collections import deque
def rotate(matrix):
matrix_d = [deque(row) for row in matrix]
for row in matrix:
if sum(row) != 0:
for row_d in matrix_d:
row_d.rotate(-1)
return [list(row) for row in matrix_d]
很好,这太好了,谢谢你。我不知道这样一个显而易见的解决办法是怎么逃过我的。正如你可能知道的,我仍然是一个新手程序员。特别感谢您如此快速地回答(4分钟,哇!)使用
deque
@stamaimer的时间几乎是一样的。转换为deque可能会减慢速度。如果我们从deque本身开始,那么它应该会更快。虽然对于小列表,它几乎不会被注意到。有趣的是,我将对此进行研究。