<p>为了好玩,下面是一个使用Python的一些功能工具的单行程序。关键成分是<a href="https://docs.python.org/3.7/library/functools.html#functools.partial" rel="nofollow noreferrer">^{<cd1>}</a>、<a href="https://docs.python.org/3.7/library/itertools.html#itertools.chain.from_iterable" rel="nofollow noreferrer">^{<cd2>}</a>和<a href="https://docs.python.org/3.7/library/operator.html#operator.not_" rel="nofollow noreferrer">^{<cd3>}</a>,它们都来自Python标准库文档的<a href="https://docs.python.org/3.7/library/functional.html#functional-programming-modules" rel="nofollow noreferrer">Functional Programming Modules</a>部分。在</p>
<pre><code>>>> 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]
</code></pre>
<p>这里的大部分工作是将线路板的线性表示转换为嵌套列表表示,然后再将其转回。这里是一步一步的。在</p>
<p>首先,将平面表示转换为嵌套表示:</p>
^{pr2}$
<p>我添加了额外的outer <code>list</code>调用,只是为了显示<code>zip</code>iterable的内容。一旦所有的步骤都完成了就没有必要了。现在用合适的键对每一行进行排序,将0向右移动:</p>
<pre><code>>>> 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]]
</code></pre>
<p>再说一次,外部列表调用是不必要的,当我们把所有东西放在一起时,它就会丢失。这里的一个关键点是Python的<a href="https://docs.python.org/3/library/functions.html#sorted" rel="nofollow noreferrer">^{<cd6>}</a>函数提供了一个稳定的排序,因此非零元素之间的顺序保持不变。最后,将其展开到一个列表中:</p>
<pre><code>>>> list(itertools.chain.from_iterable(sorted_nested))
[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]
</code></pre>
<p>把这些放在一起,去掉不必要的内部转换以列出,您将得到这篇文章顶部的一行代码。在</p>
<pre><code>>>> 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]
</code></pre>