在2048年制作换班功能

J. *_*Doe 4 python list python-3.x

让我们说我有一个清单:

board = [2, 4, 0, 2, 8, 4, 4, 8, 0, 2, 0, 0, 4, 0, 2, 2]
Run Code Online (Sandbox Code Playgroud)

我已经有一些代码可以使列表显示如下:

2 4 0 2
8 4 4 8
0 2 0 0
4 0 2 2
Run Code Online (Sandbox Code Playgroud)

那么有没有办法让我从每一行中删除每一个0并将其添加回最后(即使列表中有不同的值),这样主板现在看起来像:

2 4 2 0
8 4 4 8
2 0 0 0
4 2 2 0
Run Code Online (Sandbox Code Playgroud)

我想使用循环执行此操作,而不是单独为每行编写单独的代码.

你也可以不用初始列表来做到这一点

board = [[2, 4, 0, 2], [8, 4, 4, 8], [0, 2, 0, 0], [4, 0, 2, 2]]
Run Code Online (Sandbox Code Playgroud)

1行的代码是:

board = [2, 0, 0, 2]
k = len(board)
board[:] = (value for value in board if value != 0)
while len(board) < k:
    board.append(0)
print(board)

Output = [2, 2, 0, 0]
Run Code Online (Sandbox Code Playgroud)

Aja*_*234 6

你可以使用list.count:

board = [2, 4, 0, 2, 8, 4, 4, 8, 0, 2, 0, 0, 4, 0, 2, 2]
new_board = [board[i:i+4] for i in range(0, len(board), 4)]
final_board = [list(filter(None, i))+([0]*i.count(0)) for i in new_board]
last_board = [i for b in final_board for i in b]
Run Code Online (Sandbox Code Playgroud)

输出:

[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]
Run Code Online (Sandbox Code Playgroud)