根据另一个列表

时间:2015-12-22 23:33:04

标签: python list sorting tuples

我正在处理由SciPy生成的群集数据,并且希望使用自定义排序顺序对我的数据进行排序。

假设我的数据看起来像这样:

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

两个列表leafIDsrowHeaders之间存在一对一的对应关系。两者的长度始终相同。例如,标题为lorem的行的叶ID为4ipsum的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]

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

  1. Zip leafIDsrowHeaders,即zippedRows = zip(leafIDs, rowHeaders)
  2. 尝试按列表rowHeaders_custom排序元组列表。
  3. 然而,我在第二步遇到了障碍。如果有关于如何执行此自定义排序的任何建议,那将是很好的。我理解我可能通过尝试使用其他列表来命令元组列表来解决XY问题,但我对sort()的理解相当有限。

2 个答案:

答案 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)]