根据另一个列表中的值对列表进行排序并排除列表中的元素?

3
要绘制瀑布图,我创建了三个列表作为输入:数值、条形文本和轴文本。 我的目标是将第一个和最后一个元素之间的每个数字按升序排序,即排除列表中的第一个和最后一个元素不参与排序。
我有三个包含以下元素的列表:
A = [50000,8000,-3000,-4000,51000]
B = ['Start','Profit1','Cost2','Cost1','End']
C = ['50K','8k','-3k','-4k','51k']

使用这里提供的方法(通过另一个列表排序列表中的值),我声明:

a_new = sorted(A)
b_new = [x for _, x in sorted(zip(A, B))]
c_new = [x for _, x in sorted(zip(A, C))]
print(a_new)
print(b_new)
print(c_new)

并将其作为输出接收:

[-4000, -3000, 8000, 50000, 51000]
['Cost1', 'Cost2', 'Profit1', 'Start', 'End']
['-4k', '-3k', '8k', '50K', '51k']

我的目标是固定列表的第一个和最后一个元素,只对所有其他元素进行排序。期望结果:

[50000,-4000,-3000,8000,51000]
['Start','Cost1', 'Cost2', 'Profit1','End']
['50K','-4k', '-3k', '8k','51k']

我认为我已经接近解决方案,但是在这里卡了很长时间...

3个回答

2
您可以在所需部分上使用np.argsort
order = np.r_[0,np.argsort(A[1:-1]) + 1, len(A)-1]
a_new = np.array(A)[order]
b_new = np.array(B)[order]
c_new = np.array(C)[order]

输出:

[50000 -4000 -3000  8000 51000]
['Start' 'Cost1' 'Cost2' 'Profit1' 'End']
['50K' '-4k' '-3k' '8k' '51k']

嘿,非常感谢,这个很有效!是否有一种方法可以将值按降序排序呢? - Botan
1
@Botan 只需还原带有 np.argsort(A[1:-1])[::-1] 的部分。 - Quang Hoang

1

虽然不太优雅,但我希望这能解决问题:

A = [50000,8000,-3000,-4000,51000]
B = ['Start','Profit1','Cost2','Cost1','End']
C = ['50K','8k','-3k','-4k','51k']

a_new = sorted(A[1:len(A)-1])
a_new.insert(0, A[0])
a_new.append(A[len(A)-1])
b_new = [x for _, x in sorted(zip(A[1:len(A)-1], B[1:len(A)-1]))]
c_new = [x for _, x in sorted(zip(A[1:len(A)-1], C[1:len(A)-1]))]
b_new.insert(0, B[0])
b_new.append(B[len(B)-1])
c_new.insert(0, C[0])
c_new.append(C[len(C)-1])
print(a_new)
print(b_new)
print(c_new)

1
一种不太美观但可能的方法是使用列表 索引
a_new = [A[0]] + sorted(A[1:-1]) + [A[-1]]
b_new = [B[0]] + [x for _, x in sorted(zip(A[1:-1], B[1:-1]))] + [B[-1]
c_new = [C[0]] + [x for _, x in sorted(zip(A[1:-1], C[1:-1]))] + [C[-1]]

“对于降序:”
a_new = [A[0]] + sorted(A[1:-1], reverse=True) + [A[-1]]
b_new = [B[0]] + [x for _, x in sorted(zip(A[1:-1], B[1:-1]),reverse=True)] + [B[-1]
c_new = [C[0]] + [x for _, x in sorted(zip(A[1:-1], C[1:-1]),reverse=True)] + [C[-1]]

升序输出:

[50000, -4000, -3000, 8000, 51000]
['Start', 'Cost1', 'Cost2', 'Profit1', 'End']
['50K', '-4k', '-3k', '8k', '51k']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接