按字母顺序对压缩列表进行排序,并根据另一个列表对第二个列表进行排序**双重排序**

时间:2020-05-19 05:36:24

标签: python python-3.x list sorting

所以我有这三个列表,

 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]

因此,“姓氏”应按字母顺序排序,然后应根据此列表对“课程”进行排序:

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

我试图制作字典并在其中排序,但是变得很复杂,我想不出办法

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

您可以像这样使用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]

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

尝试过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文件,最好使用熊猫