我正在处理由SciPy生成的群集数据,并且希望使用自定义排序顺序对我的数据进行排序。
假设我的数据看起来像这样:
leafIDs = [4,5,3,1,2]
rowHeaders = ['lorem','ipsum','dolor','sit','amet']
两个列表leafIDs
和rowHeaders
之间存在一对一的对应关系。两者的长度始终相同。例如,标题为lorem
的行的叶ID为4
,ipsum
的ID为5
,依此类推。请注意,leafID是不我想要对它们进行排序的顺序(否则我可以使用tried and tested method)。预期的一对一对应关系可以看作如下:
+---------+------------+
| leafIDs | rowHeaders |
+---------+------------+
| 4 | lorem |
| 5 | ipsum |
| 3 | dolor |
| 1 | sit |
| 2 | amet |
+---------+------------+
现在我想通过自定义顺序对这两个数组进行排序,再次,它将始终与上述两个列表的长度相同。您可以将其视为rowHeaders
:
rowHeaders_custom = ['amet','lorem','sit','ipsum','dolor']
期望的结果,其中leafIDs
将根据rowHeaders_custom
及其与rowHeaders
的一对一关系排序,即:
# Desired outcome
leafIDs_custom = [2,4,1,5,3]
到目前为止我尝试过的方法:我的方法目前如下:
leafIDs
和rowHeaders
,即zippedRows = zip(leafIDs, rowHeaders)
。rowHeaders_custom
排序元组列表。然而,我在第二步遇到了障碍。如果有关于如何执行此自定义排序的任何建议,那将是很好的。我理解我可能通过尝试使用其他列表来命令元组列表来解决XY问题,但我对sort()
的理解相当有限。
答案 0 :(得分:4)
如果您从dict
中提出zippedRows
该怎么办?即。
>>> dict(zip(rowHeaders, leafIDs))
{'ipsum': 5, 'sit': 1, 'lorem': 4, 'amet': 2, 'dolor': 3}
捕获,然后:
dictRows = dict(zip(rowHeaders, leafIDs))
您可以从中拉出值:
leafIDs_custom = [dictRows[v] for v in rowHeaders_custom]
我不知道,可能有更多的pythonic方法可以做到,但这就是我想出的解决方案。
答案 1 :(得分:2)
我认为你有几行要重新排列,而不仅仅是一行。
这是一个仅执行一次列转换的解决方案, 没有为每个要排序的行(元组)构建映射。毕竟,目的地保持不变。
它标记了标题的原始位置,然后构建从这些位置拾取的重新排列的元组
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)
产生
[(2, 4, 1, 5, 3), (5, 1, 4, 2, 3), (0, 6, 9, 7, 8)]