代码之家  ›  专栏  ›  技术社区  ›  Michael Davila

按A1 B1 C1顺序的第一个元素对元组进行排序

  •  -1
  • Michael Davila  · 技术社区  · 1 年前

    我有两个zip列表,我正试图按A1 B1 C1对元组进行排序

    l1 = ['F2', 'G2', 'B2', 'H2', 'A3', 'E3', 'G3', 'C1', 'D1', 'E1', 'D2', 'C3', 'A1']
    l2 = [40, 40, 90, 90, 90, 90, 90, 120, 120, 120, 120, 120, 90]
    

    密码

    l1, l2 = [list(i) for i in zip(*sorted(zip(l1, l2), key=lambda x: list(map(int,x[0][1:]))))]
    
    print (l1)
    print (l2)
    

    电流输出:

    ['C1', 'D1', 'E1', 'A1', 'F2', 'G2', 'B2', 'H2', 'D2', 'A3', 'E3', 'G3', 'C3']
    [120, 120, 120, 90, 40, 40, 90, 90, 120, 90, 90, 90, 120]
    

    预期结果应该是:

    l1 = ['A1', 'C1', 'D1', 'E1', 'B2', 'D2', 'F2', 'G2', 'H2', 'A3', 'C3', 'E3', 'G3']
    

    如何获得预期的结果,而不是目前的结果?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Bill    1 年前

    我真的不确定你的代码想做什么。我可以得到你想要的结果如下:

    l1 = list(sorted(l1, key=lambda item: (item[1], item[0])))
    print(l1)
    

    输出

    ['A1', 'C1', 'D1', 'E1', 'B2', 'D2', 'F2', 'G2', 'H2', 'A3', 'C3', 'E3', 'G3']
    

    注意:此解决方案仅适用于中的项 l1 长度是两个字符( 'A10' 不会被正确地排序)。

    你没有表现出来 l2 在您想要的结果中。

    使现代化

    如果要同时对两个列表进行排序,可以按如下方式组合它们:

    combined = zip(l1, l2)
    combined = list(sorted(combined, key=lambda item: (item[0][1], item[0][0])))
    print(combined)
    

    输出

    [('A1', 90), ('C1', 120), ('D1', 120), ('E1', 120), ('B2', 90), ('D2', 120), ('F2', 40), ('G2', 40), ('H2', 90), ('A3', 90), ('C3', 120), ('E3', 90), ('G3', 90)]
    

    要解压缩组合结果,请使用以下语句:

    l1_sorted = [item[0] for item in combined]
    l2_sorted = [item[1] for item in combined]
    

    您也可以使用zip函数进行解压缩,如前所述 here .