【问题标题】:Sort zipped lists alphabetically and also sort the second one based on another list**Double sorting**按字母顺序对压缩列表进行排序,并根据另一个列表对第二个列表进行排序**双重排序**
【发布时间】:2020-05-19 05:36:24
【问题描述】:

所以我有这三个列表,

 last_names= ["B","A","A","A","B","G","G"]
 courses = [ 'Comp','Chem','Phys', 'Comp', 'Chem', 'Phys', 'Chem']
 grades = [3,2,3,3,2,1,3]

所以“last_names”应该按字母顺序排序,然后“courses”应该根据这个列表排序:

 ['Math','Chem','Comp','Phys']

所有这一切都应该发生,而三个列表中的元素应该以相同的方式重新排序,以便我们保持所有三个相互连接。

所以结果应该是这样的:

 last_names= ["A","A","A","B","B","G","G"]
 courses = [ 'Chem','Comp','Phys', 'Chem', 'Comp', 'Chem', 'Phys']
 grades = [2,3,3,2,3,3,1]

我试图制作一本字典并在那里对其进行排序,但它变得很复杂,我想不出办法

【问题讨论】:

    标签: python python-3.x list sorting


    【解决方案1】:

    您可以压缩三元组,按姓氏和课程对它们进行排序,然后取回元素。
    我正在使用字典将课程与索引相关联,以便我们可以在恒定时间内查找索引,而不是使用courses_order.index()

    >>> courses_order = ['Math','Chem','Comp','Phys']
    >>> courses_idx = {el:idx for idx, el in enumerate(courses_order)}
    >>> t = sorted(zip(last_names, courses, grades), key=lambda x:(x[0],courses_idx[x[1]]))
    >>> last_names, courses, grades = zip(*t)
    >>> last_names
    ('A', 'A', 'A', 'B', 'B', 'G', 'G')
    >>> courses
    ('Chem', 'Comp', 'Phys', 'Chem', 'Comp', 'Chem', 'Phys')
    >>> grades
    (2, 3, 3, 2, 3, 3, 1)
    

    【讨论】:

      【解决方案2】:

      您可以使用zip*(unpacking)List Comprehensions 的组合来获取您的输出

      last_names,courses,grades = [list(tup) for tup in zip(*sorted(zip(last_names,courses,grades)))]
      

      【讨论】:

        【解决方案3】:

        您可以使用 zip 并枚举类似

        courses_sort = ['Math','Chem','Comp','Phys']
        for i, v in enumerate(sorted(zip(last_names, courses, grades), key=lambda x: x[0]+ str(courses_sort.index(x[1])))):
            last_names[i], courses[i], grades[i] = v[0], v[1], v[2]
        

        此代码将连接三个列表中相同索引中的值,然后按 last_names 列表对它们进行排序。
        输出

        last_names = ['A', 'A', 'A', 'B', 'B', 'G', 'G']
        courses = ['Chem', 'Comp', 'Phys', 'Chem', 'Comp', 'Chem', 'Phys']
        grades = [2, 3, 3, 2, 3, 3, 1]
        

        【讨论】:

          【解决方案4】:

          尝试过 numpy 或 pandas 吗? 如果使用 numpy 看起来像:

          import numpy as np
          data = np.sort(np.array([last_names,courses,grades]))
          

          或使用熊猫看起来像:

          import pandas as pd
          data = pd.DataFrame({'lastnames':last_names,'courses':courses,'grades':grades})
          data.sort_values(by=['lastnames'],inplace=True)
          

          如果您使用 xlsx 或 csv 文件,最好使用 pandas

          【讨论】:

          • 谢谢!我已经做到了,但问题出在第二步,我必须根据我上面提到的特定列表来学习课程,所以基本上它是双重排序
          猜你喜欢
          • 1970-01-01
          • 2023-04-01
          • 2012-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-03
          • 2022-11-16
          • 2018-09-15
          相关资源
          最近更新 更多