Це давнє запитання, але деякі відповіді, які я бачу, опубліковані насправді не працюють, тому що zip
це не можливо. Інші відповіді не турбувались import operator
та надайте тут більше інформації про цей модуль та його переваги.
Для цієї проблеми є щонайменше дві хороші фразеології. Починаючи з наведеного вами прикладу:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Це також відоме під назвою " Шварцзіанський транспорт" після Р. Шварца, який популяризував цю модель в Перлі в 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')