我有一个矩阵如下所示
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"""
这是我的代码块:
lines= [i.strip().split() for i in matrix.splitlines()]
lst=[[lines[i][j] for i in range(len(lines))]for j in range(len(lines[0]))]
h=0
while h<=len(lines[0]):
for i in range(len(lines[0])-1,0,-1):
for j in range(len(lines)-1,-1,-1):
for k in lst:
if k.count('A')==len(lines):
if lines[j][i-1]=='A':
lines[j][i-1]=lines[j][i]
lines[j][i]='A'
h+=1
for line in lines:
print(*(i or " " for i in line) , sep=" ")
如果一列中满是a,我想将该列移到最右边,但我的代码将所有a移到右边。这是我的输出:
8 1 8 A A A A
8 5 3 8 A A A
7 2 1 4 7 A A
6 1 3 2 5 7 A
2 4 5 1 1 1 A
我想要这样的输出:
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
这里有一种使用
numpy
的方法:您可以使用^{} 来定位
all
值为0
的列,并将它们与最后一列交换:首先,让我们定义一个实用函数来转置列表列表,比如
然后,让我们根据规则定义排序键:如果列表元素等于'A',则它最后一个,否则保持在原始位置
在那之后,我们的解决方案将是
这给了我们
或者正如@PatrickArtner指出的,
sorted
使用Timsort,也就是stable algorithm,所以我们不需要处理case,将非all-“A”列保留在它们原来的位置并定义:之后我们就可以简单地写了
您可以use ^{} 将矩阵转置,将所有纯
"A"
的矩阵排序到其末尾,然后再次使用zip()
反转转置:输出:
转换后的数据如下所示:
sort/sorting之所以有效,是因为只有
True
如果整行由'A'
(True == 1
)组成,其他所有行都是False == 0
。你知道吗排序是稳定的,因此不会改变计算
False
的行之间的相对顺序。你知道吗相关问题 更多 >
编程相关推荐