簡體   English   中英

按字母順序對壓縮列表進行排序,並根據另一個列表對第二個列表進行排序**雙重排序**

[英]Sort zipped lists alphabetically and also sort the second one based on another list**Double 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]

所以“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]

我試圖制作一本字典並在那里對它們進行排序,但它變得很復雜,我無法找到一種方法來做到這一點

您可以 zip 三元組,按姓氏和課程對它們進行排序,然后取回元素。
我正在使用字典將課程與索引相關聯,以便我們可以在恆定時間內查找索引,而不是使用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)

您可以使用 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 列表對它們進行排序。
Output

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]

您可以使用zip*(unpacking)List Comprehensions的組合來獲得您的 output

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

嘗試過 numpy 或 pandas 嗎? 如果使用 numpy 看起來像:

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

或使用 pandas 看起來像:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM