Il s'agit d'une vieille question, mais certaines des réponses que je vois publiées ne fonctionnent pas car elles zip
ne sont pas scriptables. Les autres réponses n'ont pas pris la peine de import operator
fournir plus d'informations sur ce module et ses avantages ici.
Il existe au moins deux bons idiomes pour ce problème. En commençant par l'exemple d'entrée que vous avez fourni:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Ceci est également connu sous le nom de Schwartzian_transform après R. Schwartz qui a popularisé ce modèle en Perl dans les années 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')
Notez que dans ce cas Y
et X
sont triés et comparés lexicographiquement. Autrement dit, les premiers éléments (de Y
) sont comparés; et s'ils sont identiques, les deuxièmes éléments (de X
) sont comparés, etc. Cela peut créer des sorties instables sauf si vous incluez les index de liste d'origine pour l'ordre lexicographique afin de conserver les doublons dans leur ordre d'origine.
Cela vous donne un contrôle plus direct sur la façon de trier l'entrée, de sorte que vous pouvez obtenir une stabilité de tri en indiquant simplement la clé spécifique à trier. Voir plus d'exemples ici .
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')