Bu eski bir soru ama yayınladığım bazı cevaplar aslında çalışmıyor çünkü zip
yazılabilir değil. Diğer cevaplar rahatsız olmadıimport operator
bu modül ve faydaları hakkında daha fazla bilgi .
Bu sorun için en az iki iyi deyim vardır. Girdiğiniz örnek girişten başlayarak:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Bu, 90'larda Perl'de bu modeli popülerleştiren R. Schwartz'ın ardından Schwartzian_transform olarak da bilinir :
# 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')
Bu durumda Y
ve X
sözlükbilimsel olarak sıralandığını ve karşılaştırıldığını unutmayın. Yani, ilk maddeler (itibaren Y
) karşılaştırılır; ve eğer bunlar aynıysa, ikinci maddeler (from X
) karşılaştırılır, vb. Yinelenenleri orijinal sıralarında tutmak için sözlükbilimsel sıralamaya ilişkin orijinal liste indekslerini dahil etmedikçe bu, kararsız çıktılar oluşturabilir .
Bu, girişin nasıl sıralanacağı üzerinde daha doğrudan kontrol sağlar, böylece sıralamak için belirli bir anahtarı belirterek sıralama kararlılığı elde edebilirsiniz . Daha fazla örneği burada görebilirsiniz .
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')