Questa è una vecchia domanda, ma alcune delle risposte che vedo pubblicate in realtà non funzionano perché zip
non sono programmabili. Altre risposte non si sono preoccupate di import operator
fornire ulteriori informazioni su questo modulo e sui suoi vantaggi qui.
Ci sono almeno due buoni modi di dire per questo problema. A partire dall'input di esempio fornito:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Questo è anche noto come Schwartzian_transform dopo R. Schwartz che ha reso popolare questo modello in Perl negli anni '90:
# Zip (decorate), sort and unzip (undecorate).
# Converting to list to script the output and extract X
list(zip(*(sorted(zip(Y,X)))))[1]
# Results in: ('a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g')
Si noti che in questo caso Y
e X
sono ordinati e confrontati lessicograficamente. Cioè, i primi elementi (da Y
) vengono confrontati; e se sono uguali, X
vengono confrontati i secondi elementi (da ) e così via. Ciò può creare output instabili a meno che non si includano gli indici dell'elenco originale per l'ordine lessicografico per mantenere i duplicati nel loro ordine originale.
Questo ti dà un controllo più diretto su come ordinare l'input, in modo da poter ottenere la stabilità dell'ordinamento semplicemente dichiarando la chiave specifica per ordinare. Vedi altri esempi qui .
import operator
# Sort by Y (1) and extract X [0]
list(zip(*sorted(zip(X,Y), key=operator.itemgetter(1))))[0]
# Results in: ('a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g')