在2048年建立一个转换函数

2024-09-24 06:33:53 发布

您现在位置:Python中文网/ 问答频道 /正文

让我们说我有一个清单:

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

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

^{pr2}$

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

^{pr3}$

我想使用循环来完成这一点,而不需要单独为每一行编写单独的代码。

也可以这样做,而不需要将初始列表设置为

^{pr4}$

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]

Tags: 代码inboard列表forlenifvalue
3条回答

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

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

x=4
nb=[]
for e in zip(*[iter(board)]*x):
    ne=[se for se in e if se!=0]
    nb.extend(ne+[0]*(x-len(ne)))  #.append if you want to maintain sub lists

>>> nb
[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]

为了好玩,下面是一个使用Python的一些功能工具的单行程序。关键成分是^{}^{}^{},它们都来自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]

这里的大部分工作是将线路板的线性表示转换为嵌套列表表示,然后再将其转回。这里是一步一步的。在

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

^{pr2}$

我添加了额外的outer list调用,只是为了显示zipiterable的内容。一旦所有的步骤都完成了就没有必要了。现在用合适的键对每一行进行排序,将0向右移动:

>>> 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的^{}函数提供了一个稳定的排序,因此非零元素之间的顺序保持不变。最后,将其展开到一个列表中:

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

您可以使用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]

输出:

^{pr2}$

相关问题 更多 >