根据另一个列表排序元组

2024-10-02 16:34:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是SciPy生成的集群数据,我想用自定义的排序顺序对数据进行排序。在

假设我的数据如下所示:

leafIDs = [4,5,3,1,2]
rowHeaders = ['lorem','ipsum','dolor','sit','amet']

两个列表leafIDs和{}之间有一对一的对应关系。两者的长度总是一样的。例如,标题为lorem的行的叶ID为4ipsum的ID为{},依此类推。请注意,叶id是而不是我想要对它们排序的顺序(否则我可以使用tried and tested method)。预期的一对一的通信可以想象如下:

^{pr2}$

现在我想按一个自定义顺序对这两个数组进行排序,同样,它的长度将始终与前面提到的两个列表的长度相同。您可以将其视为rowHeaders的乱序:

rowHeaders_custom = ['amet','lorem','sit','ipsum','dolor']

期望的结果,其中leafIDs将根据rowHeaders_custom及其与{}的一对一关系进行排序,即:

# Desired outcome
leafIDs_custom = [2,4,1,5,3]

到目前为止,我尝试的方法如下:

  1. 压缩leafIDs和{},即zippedRows = zip(leafIDs, rowHeaders)。在
  2. 尝试按列表rowHeaders_custom对元组列表进行排序。在

然而,我在第二步遇到了障碍。如果有任何关于如何执行这种定制排序的建议,那就太好了。我知道我试图用另一个列表排序元组列表可能会遇到XY问题,但我对sort()的理解相当有限。在


Tags: 数据id列表排序关系顺序custom元组
2条回答

如果你用zippedRows做一个dict怎么办?一、 e

>>> dict(zip(rowHeaders, leafIDs))
{'ipsum': 5, 'sit': 1, 'lorem': 4, 'amet': 2, 'dolor': 3}

捕捉到,然后:

^{pr2}$

你可以从中提取价值:

leafIDs_custom = [dictRows[v] for v in rowHeaders_custom]

我不知道,也许还有一种更像Python的方法来做,但这就是我正在想出的解决办法。在

我想你有几排要重新安排,而不是一排。在

这里有一个只执行列转换一次的解决方案, 没有为要排序的每一行(元组)构建映射。毕竟,目的地还是一样的。在

它标记头的原始位置,然后从这些位置构建重新排列的元组

leaf_lst = [(4,5,3,1,2), (1,2,3,4,5), (6,7,8,9,0)]
rowHeaders = ['lorem','ipsum','dolor','sit','amet']
rowHeaders_custom = ['amet','lorem','sit','ipsum','dolor']

old_pos = tuple(rowHeaders.index(h) for h in rowHeaders_custom)
leaf_lst_custom  = [tuple(t[p] for p in old_pos) for t in leaf_lst]
print(leaf_lst_custom)

生产

^{pr2}$

相关问题 更多 >