簡體   English   中英

在 2 個或多個列表之間交換具有相同索引的元素

[英]Swapping elements with the same index between 2 or more lists

我想將所有 0 移到主列表(或頂部視為 2d 列表)的左側。 我的解決方案非常幼稚,它只交換一個值,當它到達末尾時,它會在開始時帶來最后一個值(我不需要)。 我試過 collections deque 但沒有很好的輸出。 我也想過一段時間循環,但我找不到解決方案。

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

讓我們從您需要獲取一個列表或可迭代對象並將零打亂到開頭的想法開始——這對於每一列都是必需的。 然后你可以通過 shuffler 進行兩個轉換(每個轉換行/列)和一個映射:

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

shuffler 可以以任何方式實現,但我喜歡生成器; 這個具體的實現是兩遍:

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)]

根據非零對列進行排序具有按所需順序排列數字的副作用:

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]]
>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM