<p>您可以<a href="https://docs.python.org/3/library/functions.html#zip" rel="nofollow noreferrer">use ^{<cd1>}</a>将矩阵转置,将所有纯<code>"A"</code>的矩阵排序到其末尾,然后再次使用<code>zip()</code>反转转置:</p>
<pre><code>matrix=""" 8 1 A A A A 8
8 5 A A A 3 8
7 2 A A 1 4 7
6 1 3 A 2 5 7
2 4 5 A 1 1 1"""
# string to list of lists of strings
m = [[x.strip() for x in line.split()] for line in matrix.split("\n")]
print(*m,sep="\n")
# transpose and sort
t_m = [list(line) for line in zip(*m)]
t_m.sort(key = lambda x: all(k=="A" for k in x))
# reverse transpose
m = [list(line) for line in zip(*t_m)]
print(*m,sep="\n")
</code></pre>
<p>输出:</p>
<pre><code># before
['8', '1', 'A', 'A', 'A', 'A', '8']
['8', '5', 'A', 'A', 'A', '3', '8']
['7', '2', 'A', 'A', '1', '4', '7']
['6', '1', '3', 'A', '2', '5', '7']
['2', '4', '5', 'A', '1', '1', '1']
# after
['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>转换后的数据如下所示:</p>
<pre><code># before sorting
['8', '8', '7', '6', '2']
['1', '5', '2', '1', '4']
['A', 'A', 'A', '3', '5']
['A', 'A', 'A', 'A', 'A'] # this is the column you want to sort behind all others
['A', 'A', '1', '2', '1']
['A', '3', '4', '5', '1']
['8', '8', '7', '7', '1']
# after sort
['8', '8', '7', '6', '2']
['1', '5', '2', '1', '4']
['A', 'A', 'A', '3', '5']
['A', 'A', '1', '2', '1']
['A', '3', '4', '5', '1']
['8', '8', '7', '7', '1']
['A', 'A', 'A', 'A', 'A'] # now it is here
</code></pre>
<p><a href="https://docs.python.org/3/library/functions.html#sorted" rel="nofollow noreferrer">sort/sorting</a>之所以有效,是因为只有<code>True</code>如果整行由<code>'A'</code>(<code>True == 1</code>)组成,其他所有行都是<code>False == 0</code>。你知道吗</p>
<p>排序是稳定的,因此不会改变计算<code>False</code>的行之间的相对顺序。你知道吗</p>