问题描述
我想将所有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]]
>>>