Python 基于另一个列表对元组进行排序

Python 基于另一个列表对元组进行排序,python,list,sorting,tuples,Python,List,Sorting,Tuples,我正在处理由SciPy生成的集群数据,并希望使用自定义排序顺序对数据进行排序 假设我的数据如下所示: leafIDs = [4,5,3,1,2] rowHeaders = ['lorem','ipsum','dolor','sit','amet'] 两个列表,leafIDs和rowHeaders之间存在一对一的对应关系。两者的长度始终相同。例如,标题为lorem的行的叶ID为4,ipsum的行ID为5,依此类推。请注意,leafid并不是我想要对它们进行排序的顺序(否则我可以使用)。预期的一对

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

假设我的数据如下所示:

leafIDs = [4,5,3,1,2]
rowHeaders = ['lorem','ipsum','dolor','sit','amet']
两个列表,
leafIDs
rowHeaders
之间存在一对一的对应关系。两者的长度始终相同。例如,标题为
lorem
的行的叶ID为
4
ipsum
的行ID为
5
,依此类推。请注意,leafid并不是我想要对它们进行排序的顺序(否则我可以使用)。预期的一对一通信可可视化如下:

+---------+------------+
| leafIDs | rowHeaders |
+---------+------------+
|       4 | lorem      |
|       5 | ipsum      |
|       3 | dolor      |
|       1 | sit        |
|       2 | amet       |
+---------+------------+
现在我想按照自定义顺序对这两个数组进行排序,同样,这两个数组的长度将始终与前面提到的两个列表相同。您可以将其视为
行标题的无序顺序

rowHeaders_custom = ['amet','lorem','sit','ipsum','dolor']
所需结果,其中
leafIDs
将根据
rowHeaders\u custom
及其与
rowHeaders
的一对一关系进行排序,即:

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

到目前为止,我已经尝试了以下方法:

+---------+------------+
| leafIDs | rowHeaders |
+---------+------------+
|       4 | lorem      |
|       5 | ipsum      |
|       3 | dolor      |
|       1 | sit        |
|       2 | amet       |
+---------+------------+
  • Zip
    leafIDs
    rowHeaders
    ,即
    zippedRows=Zip(leafIDs,rowHeaders)
  • 尝试按列表
    rowHeaders\u custom
    对元组列表进行排序

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

    如果用
    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风格的方法,但这就是我提出的解决方案。

    如果你用
    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]
    

    我不知道,也许有一种更像蟒蛇的方法可以做到这一点,但这就是我提出的解决方案。

    我想你需要重新排列好几行,而不是一行

    这是一个只执行一次列转换的解决方案, 无需为要排序的每一行(元组)构建映射。毕竟,目的地保持不变

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

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

    我想你有几行需要重新排列,而不是一行

    这是一个只执行一次列转换的解决方案, 无需为要排序的每一行(元组)构建映射。毕竟,目的地保持不变

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

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

    谢谢,它工作得很好!从未想过使用dict,实际上这是一个相当巧妙的解决方案。另外,
    leaveids\u custom=[dictRows[v]for v in rowHeaders\u custom]
    已经是相当pythonic的了;)谢谢,它工作得很好!从未想过使用dict,实际上这是一个相当巧妙的解决方案。另外,
    leaveids\u custom=[dictRows[v]for v in rowHeaders\u custom]
    已经是相当pythonic的了;)@PadraicCunningham-OP提到这个问题是不够的,我很确定它是不够的。@TigerhawkT3,使用完全相同的逻辑。它不考虑额外需要的查找。而且,OP再次提到了这一点,并说它没有完全解决他的问题,这就是为什么他提出了一个新问题,正如dup样板文件所指示的那样。@PadraicCunningham-OP提到的这个问题是不够的,我敢肯定它是。@TigerhawkT3,使用完全相同的逻辑dit不考虑额外需要的查找。同样,OP提到了这一点,并说它没有完全解决他的问题,这就是为什么他提出了一个新问题,正如dup样板所示。谢谢你的回答!如果我有元组数组,那么您的代码非常有用,但是我的情况没有您想象的那么复杂,因此它实际上不需要任何进一步的扩展性:)谢谢您的回答!如果我有元组数组,那么您的代码非常有用,但我的情况并不像您想象的那么复杂,因此它实际上不需要任何进一步的扩展性:)