Alors j'ai ces trois listes,

 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]

Ainsi, "last_names" doit être trié par ordre alphabétique, puis "cours" doit être trié en fonction de cette liste:

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

Tout cela devrait se produire pendant que les éléments de la liste des trois devraient être réorganisés de la même manière afin que nous les gardions tous les trois connectés les uns aux autres.

Les résultats devraient donc ressembler à ceci:

 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]

J'ai essayé de créer un dictionnaire et de les trier là-dedans, mais cela s'est compliqué et je ne pouvais pas trouver un moyen de le faire

1
Data_sniffer 19 mai 2020 à 08:36

4 réponses

Meilleure réponse

Vous pouvez compresser les triplets, les trier par nom de famille et par cours, puis récupérer les éléments.
J'utilise un dictionnaire pour associer le cours à l'index afin que nous puissions rechercher l'index en temps constant au lieu d'utiliser 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
abc 19 mai 2020 à 05:56

Vous pouvez utiliser une combinaison de zip, *(unpacking) et Listez les compréhensions pour obtenir votre sortie

last_names,courses,grades = [list(tup) for tup in zip(*sorted(zip(last_names,courses,grades)))]
1
Shijith 19 mai 2020 à 06:02

Avez essayé numpy ou pandas? si vous utilisez numpy ressemble à:

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

Ou en utilisant des pandas ressemblent à:

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

Si vous travaillez avec un fichier xlsx ou csv, mieux vaut utiliser pandas

1
Wahyu Hadinoto 19 mai 2020 à 06:11

Vous pouvez utiliser zip et énumérer pour cela comme

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]

Ce code concatera les valeurs dans le même index à partir des trois listes, puis les triera selon la liste last_names.
Production

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
Leo Arad 19 mai 2020 à 06:10