Ini adalah pertanyaan lama tetapi beberapa jawaban yang saya lihat tidak benar-benar berfungsi karena zip
tidak dapat skrip. Jawaban lain tidak menggangguimport operator
dan memberikan lebih banyak info tentang modul ini dan manfaatnya di sini.
Setidaknya ada dua idiom yang bagus untuk masalah ini. Dimulai dengan contoh input yang Anda berikan:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Ini juga dikenal sebagai Schwartzian_transform setelah R. Schwartz yang mempopulerkan pola ini di Perl pada tahun 90-an:
# 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')
Perhatikan bahwa dalam hal ini Y
dan X
diurutkan dan dibandingkan secara leksikografis. Artinya, item pertama (dari Y
) dibandingkan; dan jika mereka sama maka item kedua (dari X
) dibandingkan, dan seterusnya. Ini dapat membuat tidak stabil output yang kecuali jika Anda memasukkan indeks daftar asli untuk pemesanan leksikografis untuk menjaga duplikat dalam urutan aslinya.
Ini memberi Anda lebih banyak kontrol langsung tentang cara mengurutkan input, sehingga Anda bisa mendapatkan stabilitas pengurutan dengan hanya menyatakan kunci spesifik untuk mengurutkan berdasarkan. Lihat lebih banyak contoh di sini .
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')