在2048年进行移位功能

时间:2018-07-03 16:48:32

标签: python python-3.x list

让我们说我有一个清单:

board = [2, 4, 0, 2, 8, 4, 4, 8, 0, 2, 0, 0, 4, 0, 2, 2]

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

2 4 0 2
8 4 4 8
0 2 0 0
4 0 2 2

所以我有办法从每行中删除每个0并将其添加回末尾(即使列表中有不同的值),这样板子现在看起来像:

2 4 2 0
8 4 4 8
2 0 0 0
4 2 2 0

我想使用循环来执行此操作,而不必单独为每一行编写单独的代码。

您也可以这样做而无需将初始列表添加到

board = [[2, 4, 0, 2], [8, 4, 4, 8], [0, 2, 0, 0], [4, 0, 2, 2]]

第一行的代码为:

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]

3 个答案:

答案 0 :(得分: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]

输出:

[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]

答案 1 :(得分:3)

有时候,简单的循环没什么问题:

true

答案 2 :(得分:2)

这很有趣,这里使用了一些Python功能工具。关键成分是functools.partialitertools.chain.from_iterableoperator.not_,它们全部来自Python标准库文档的Functional Programming Modules部分。

>>> import functools, itertools, operator
>>> board = [2, 4, 0, 2, 8, 4, 4, 8, 0, 2, 0, 0, 4, 0, 2, 2]
>>> list(itertools.chain.from_iterable(map(functools.partial(sorted, key=operator.not_), zip(*[iter(board)]*4))))
[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]

此处的大部分工作是将电路板的线性表示形式转换为嵌套的列表列表形式,然后再次将其返回。这是逐步的。

首先,将平面表示形式转换为嵌套表示形式:

>>> nested = list(zip(*[iter(board)]*4))
>>> nested
[(2, 4, 0, 2), (8, 4, 4, 8), (0, 2, 0, 0), (4, 0, 2, 2)]

我添加了额外的外部list调用,只是为了显示zip迭代的内容。一旦所有步骤放在一起,就没有必要了。现在,使用合适的键对每一行进行排序,以将零向右移动:

>>> sorted_nested = list(map(functools.partial(sorted, key=operator.not_), nested))
>>> sorted_nested
[[2, 4, 2, 0], [8, 4, 4, 8], [2, 0, 0, 0], [4, 2, 2, 0]]

同样,外部列表调用是不必要的,将所有内容放在一起将丢失它。这里的关键是Python的sorted函数提供了稳定的排序,因此非零元素彼此之间保持相同的顺序。最后,重新整理成一个列表:

>>> list(itertools.chain.from_iterable(sorted_nested))
[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]

将所有内容放在一起,然后删除不必要的内部转换以列出,您将在此文章的顶部获得一个衬里。

>>> list(itertools.chain.from_iterable(map(functools.partial(sorted, key=operator.not_), zip(*[iter(board)]*4))))
[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]