所以我有这三个列表,
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]
我试图制作字典并在其中排序,但是变得很复杂,我想不出办法
答案 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文件,最好使用熊猫