在 2 个或多个列表之间交换具有相同索引的元素

Swapping elements with the same index between 2 or more lists

我想将所有 0 移动到主列表的左侧(或顶部视为 2d 列表)。我的解决方案非常天真,它只交换一个值,当它到达终点时,它在开始时带来最后一个值(我不需要)。我试过使用 collections deque 但没有好的输出。我也在考虑 while 循环,但找不到解决方案。

x = [[0,2,1], [4,2,0], [0,0,0], [3,0,0]]

             0 2 1                 0 0 0
 Input -->>  4 2 0    Output -->>  0 0 0    OR  x = [ [0,0,0], [0,0,0], [4,2,0], [3,2,1] ]
             0 0 0                 4 2 0
             3 0 0                 3 2 1

for i in range(len(x)):
    for index, j in enumerate(x[i]):
        if j == 0:
            x[i][index] = x[i-1][index]
            x[i-1][index] = 0

根据 non-zero 对列进行排序具有按所需顺序排列数字的副作用:

x = [[0, 2, 1], [4, 2, 0], [0, 0, 0], [3, 0, 0]]

print(list(map(list, zip(*(sorted(col, key=lambda n: n != 0) for col in zip(*x))))))

输出:

[[0, 0, 0], [0, 0, 0], [4, 2, 0], [3, 2, 1]]
>>> 

让我们从您需要获取列表或可迭代对象并将零打乱到开头的想法开始——这对每一列都是必需的。然后你可以做这两个变换(每个变换 rows/columns)和一个通过洗牌器的映射:

x = zip(*map(shuffer, zip(*x)))

洗牌器可以以任何方式实现,但我喜欢生成器;这个具体实现是两遍:

def shuffler(input):
    for i in input:
        if not i: yield 0
    for i in input:
        if i: yield i

我认为结果正确:

>>> print zip(*map(shuffler, zip(*x)))
[(0, 0, 0), (0, 0, 0), (4, 2, 0), (3, 2, 1)]