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

问题描述

我想将所有0移到主列表的左侧(或顶部为2d列表)。我的解决方案非常幼稚,它只交换一个值,当交换到最后时,它在开始时带来了最后一个值(我不需要)。我已经尝试过收集双端队列,但没有很好的输出。我也在考虑一个while循环,但找不到解决方案。

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

             0 2 1                 0 0 0
 Input -->>  4 2 0    Output -->>  0 0 0    OR  x = [ [0,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

解决方法

让我们从一个想法开始,即您需要获取一个列表或可迭代的对象,并从零开始将零洗牌-这是每列都需要的。然后,您可以执行两个转换(每个转换行/列)和通过随机播放器映射:

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,(4,2,(3,1)]
,

基于非零的排序列具有将数字按所需顺序排列的副作用:

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

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

输出:

[[0,1]]
>>>