Dies ist eine alte Frage, aber einige der Antworten, die ich gepostet sehe, funktionieren nicht wirklich, weil sie zip
nicht skriptfähig sind. Andere Antworten störten nichtimport operator
und bieten hier weitere Informationen zu diesem Modul und seinen Vorteilen.
Es gibt mindestens zwei gute Redewendungen für dieses Problem. Beginnend mit der von Ihnen angegebenen Beispieleingabe:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Dies ist auch als Schwartzian_transform nach R. Schwartz bekannt, der dieses Muster in den 90er Jahren in Perl populär machte:
# 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')
Beachten Sie, dass in diesem Fall Y
und X
lexikographisch sortiert und verglichen werden. Das heißt, die ersten Elemente (von Y
) werden verglichen; und wenn sie gleich sind, werden die zweiten Elemente (von X
) verglichen und so weiter. Dies kann zu Instabilitäten führen Ausgaben führen, es sei denn, Sie geben die ursprünglichen Listenindizes für die lexikografische Reihenfolge an, um Duplikate in ihrer ursprünglichen Reihenfolge zu halten.
Auf diese Weise können Sie direkter steuern, wie die Eingabe sortiert wird, sodass Sie die Sortierstabilität erhalten, indem Sie einfach den spezifischen Schlüssel angeben, nach dem sortiert werden soll. Weitere Beispiele finden Sie hier .
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')