<p>首先,让我们定义一个实用函数来转置列表列表,比如</p>
<pre><code>def transpose(elements):
return list(map(list, zip(*elements)))
</code></pre>
<p>然后,让我们根据规则定义排序键:如果列表元素等于'A',则它最后一个,否则保持在原始位置</p>
<pre><code>def sorting_key(indexed_row):
return all(element == 'A' for element in indexed_row[1]), indexed_row
</code></pre>
<p>在那之后,我们的解决方案将是</p>
<pre><code>>>> from operator import itemgetter
>>> transpose(map(itemgetter(1), sorted(enumerate(transpose(lines)),
key=sorting_key)))
</code></pre>
<p>这给了我们</p>
<pre><code>[['8', '1', 'A', 'A', 'A', '8', 'A'],
['8', '5', 'A', 'A', '3', '8', 'A'],
['7', '2', 'A', '1', '4', '7', 'A'],
['6', '1', '3', '2', '5', '7', 'A'],
['2', '4', '5', '1', '1', '1', 'A']]
</code></pre>
<p>或者正如@PatrickArtner指出的,<code>sorted</code>使用<a href="https://en.wikipedia.org/wiki/Timsort" rel="nofollow noreferrer"><em>Timsort</em></a>,也就是<a href="https://en.wikipedia.org/wiki/Category:Stable_sorts" rel="nofollow noreferrer">stable algorithm</a>,所以我们不需要处理case,将非all-“A”列保留在它们原来的位置并定义:</p>
<pre><code>def sorting_key(row):
return all(element == 'A' for element in row)
</code></pre>
<p>之后我们就可以简单地写了</p>
<pre><code>>>> transpose(sorted(transpose(lines),
key=sorting_key))
</code></pre>