Это старый вопрос, но некоторые ответы, которые я вижу опубликованными, на самом деле не работают, потому что они zip
не предназначены для сценариев. Другие ответы не удосужилисьimport operator
и предоставить больше информации об этом модуле и его преимуществах здесь.
Есть как минимум две хорошие идиомы для этой проблемы. Начиная с примера ввода, который вы предоставили:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Это также известно как Schwartzian_transform после Р. Шварца, который популяризировал эту модель в Perl в 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')
Обратите внимание, что в этом случае Y
и X
сортируются и сравниваются лексикографически. То есть Y
сравниваются первые элементы (из ); и если они одинаковы, то X
сравниваются вторые элементы (из ) и так далее. Это может создать нестабильную выходные данные, если вы не включите исходные индексы списка для лексикографического порядка, чтобы сохранить дубликаты в их первоначальном порядке.
Это дает вам более прямой контроль над тем, как сортировать ввод, так что вы можете получить стабильность сортировки , просто указав конкретный ключ для сортировки. Смотрите больше примеров здесь .
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')