2015-12-22 138 views
0

我正在处理由SciPy生成的集群数据,并且喜欢使用自定义排序顺序来排序数据。基于另一个列表对元组进行排序

比方说,我的数据找出来是这样的:

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

有两个列表,leafIDsrowHeaders之间有一个一一对应。两者的长度始终相同。例如,标题为lorem的行将具有4的叶ID,ipsum将具有5的ID等等。请注意,这些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. 邮编leafIDsrowHeaders,即zippedRows = zip(leafIDs, rowHeaders)
  2. 尝试按列表rowHeaders_custom对元组列表进行排序。

但是,我在第二步中遇到了障碍。如果对如何执行这种自定义排序排序有任何建议,这将很好。我知道我可能会尝试使用另一个列表来排列元组列表,但是我对sort()的理解是相当有限的。

+0

@PadraicCunningham - 这个问题是由OP提及作为不足,我很确定它是。 – TigerhawkT3

+0

@ TigerhawkT3,使用完全相同的逻辑 –

+0

它没有考虑额外的所需查找。而且,OP再一次提到它,并说它没有完全解决他的问题,这就是为什么他提出了一个新的问题,就像dupplate样板指示的那样。 – TigerhawkT3

回答

4

如果您在zippedRows中制作dict,该怎么办?即

>>> 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] 

我不知道,有可能是一个更Python的方式来这样做,但这是我想出来的解决方案。

+0

谢谢,它工作完美!从来没有想过使用'dict',实际上 - 这是一个相当巧妙的解决方案。另外,'leafIDs_custom = [dictRows [v] for rowHeaders_custom]'是非常pythonic;) – Terry

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)] 
+0

感谢您的答案!如果我有元组数组,那么你的代码是非常有用的,但是我的情况并不像你想象的那么复杂,所以它并不需要任何进一步的扩展:) – Terry

相关问题