Mam listę takich ciągów:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Jaki jest najkrótszy sposób sortowania X przy użyciu wartości z Y, aby uzyskać następujące dane wyjściowe?
["a", "d", "h", "b", "c", "e", "i", "f", "g"]
Kolejność elementów mających ten sam „klucz” nie ma znaczenia. Mogę skorzystać z for
konstruktów, ale jestem ciekawy, czy istnieje krótsza droga. Jakieś sugestie?
Odpowiedzi:
Najkrótszy kod
Przykład:
Mówiąc ogólnie
Wyjaśnione:
zip
dwalist
s.list
wedługzip
użyciasorted()
.list
.Aby uzyskać więcej informacji na temat ustawiania \ używania
key
parametru orazsorted
ogólnie funkcji, spójrz na to .źródło
Zbierz razem dwie listy, posortuj je, a następnie weź potrzebne części:
Połącz je razem, aby uzyskać:
źródło
X
jest to listastr
, ale bądź ostrożny, jeśli istnieje możliwość, która<
nie jest zdefiniowana dla niektórych par przedmiotówX
, np. - jeśli niektóre z nich byłyNone
AttributeError: 'zip' object has no attribute 'sort'
to właśnie otrzymuję.sorted(zip(...))
powinien nadal działać, lub:them = list(zip(...)); them.sort()
Ponadto, jeśli nie masz nic przeciwko korzystaniu z tablic numpy (lub w rzeczywistości już masz do czynienia z tablicami numpy ...), oto inne fajne rozwiązanie:
Znalazłem to tutaj: http://scienceoss.com/sort-one-list-by-another-list/
źródło
sortedArray1= array1[array2.argsort()]
. Ułatwia to także sortowanie wielu list według określonej kolumny tablicy 2D: np.sortedArray1= array1[array2[:,2].argsort()]
Sortowanie tablicy1 (która może mieć wiele kolumn) według wartości w trzeciej kolumnie tablicy2.Najbardziej oczywistym rozwiązaniem jest użycie
key
słowa kluczowego arg.Pamiętaj, że możesz skrócić to do jednej linijki, jeśli zależy Ci na:
źródło
Przybyłem tutaj, aby posortować listę według listy, w której wartości są zgodne.
źródło
index
wykona wyszukiwanie O (N) wlist_a
wynikuO(N² log N)
sortowania.more_itertools
ma narzędzie do sortowania iteracyjnych równolegle:Dany
Próbny
źródło
Lubię mieć listę posortowanych indeksów. W ten sposób mogę posortować dowolną listę w tej samej kolejności co lista źródłowa. Po utworzeniu listy posortowanych indeksów wystarczy proste zrozumienie listy:
Zauważ, że można również uzyskać posortowaną listę indeksów
numpy.argsort()
.źródło
Kolejna alternatywa, łącząca kilka odpowiedzi.
Aby pracować dla Python3:
źródło
zip, sortuj według drugiej kolumny, zwróć pierwszą kolumnę.
źródło
list(zip(*sorted(zip(X,Y), key=operator.itemgetter(1))))[0]
Szybki jednowarstwowy.
Powiedz, że chcesz, aby lista a pasowała do listy b.
Jest to pomocne, gdy trzeba zamówić mniejszą listę z wartościami większymi. Zakładając, że większa lista zawiera wszystkie wartości na mniejszej liście, można to zrobić.
źródło
X
iY
?index
wykona wyszukiwanie O (N) wlist_b
wynikuO(N² log N)
sortowania.Możesz utworzyć
pandas Series
, używając podstawowej listy jakodata
i drugiej listy jakoindex
, a następnie po prostu posortować według indeksu:wynik:
źródło
Oto odpowiedź Whatangsa, jeśli chcesz uzyskać obie posortowane listy (python3).
Pamiętaj tylko, że Zx i Zy to krotki. Wędruję również, jeśli istnieje lepszy sposób na zrobienie tego.
Ostrzeżenie: jeśli uruchomisz go z pustymi listami, ulega awarii.
źródło
Stworzyłem bardziej ogólną funkcję, która sortuje więcej niż dwie listy w oparciu o inną, inspirowaną odpowiedzią @ Whatang.
źródło
Aby uzyskać unikalne wartości obecne w
list2
Aby znaleźć lokalizację indeksu w
list2
Lokalizacja indeksu
list2
jest śledzona za pomocącur_loclist
[0, 3, 7, 1, 2, 4, 8, 5, 6]
źródło
To stare pytanie, ale niektóre odpowiedzi, które widzę, nie są w rzeczywistości skuteczne, ponieważ
zip
nie można ich skryptować. Inne odpowiedzi nie przeszkadzałyimport operator
i podają więcej informacji o tym module i jego zaletach tutaj.Istnieją co najmniej dwa dobre idiomy dotyczące tego problemu. Począwszy od podanego przykładowego wejścia:
Korzystanie z idiomu „ Dekorowanie-Sortowanie-Undecorowanie ”
Jest to również znane jako Schwartzian_transform po R. Schwartz, który spopularyzował ten wzór w Perlu w latach 90.:
Zauważ, że w tym przypadku
Y
iX
są klasyfikowane i porównano leksykograficznie. Oznacza to, że pierwsze pozycje (odY
) są porównywane; a jeśli są takie same, wówczasX
porównywane są drugie elementy (z ) i tak dalej. Może to tworzyć niestabilne dane wyjściowe, chyba że podasz oryginalne indeksy listy dla porządku leksykograficznego, aby zachować duplikaty w ich oryginalnej kolejności.Korzystanie z
operator
modułuZapewnia to większą bezpośrednią kontrolę nad sposobem sortowania danych wejściowych, dzięki czemu można uzyskać stabilność sortowania , po prostu określając konkretny klucz do sortowania. Zobacz więcej przykładów tutaj .
źródło