Ich habe eine Liste solcher Zeichenfolgen:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Was ist der kürzeste Weg, um X mit Werten von Y zu sortieren, um die folgende Ausgabe zu erhalten?
["a", "d", "h", "b", "c", "e", "i", "f", "g"]
Die Reihenfolge der Elemente mit demselben "Schlüssel" spielt keine Rolle. Ich kann auf die Verwendung von for
Konstrukten zurückgreifen, bin aber gespannt, ob es einen kürzeren Weg gibt. Irgendwelche Vorschläge?
Antworten:
Kürzester Code
Beispiel:
Allgemein gesagt
Erklärt:
zip
die beidenlist
s.list
nach derzip
Verwendungsorted()
.list
.Weitere Informationen zum Festlegen \ Verwenden des
key
Parameters sowie dersorted
Funktion im Allgemeinen finden Sie hier .quelle
Zippen Sie die beiden Listen zusammen, sortieren Sie sie und nehmen Sie die gewünschten Teile:
Kombinieren Sie diese, um Folgendes zu erhalten:
quelle
X
es sich um eine Liste handeltstr
, aber seien Sie vorsichtig, wenn es eine Möglichkeit<
gibt, die für einige Artikelpaare in nicht definiert istX
, z. B. - wenn einige davon warenNone
AttributeError: 'zip' object has no attribute 'sort'
bekomme ich das ab sofort.sorted(zip(...))
sollte noch funktionieren, oder:them = list(zip(...)); them.sort()
Wenn es Ihnen nichts ausmacht, Numpy-Arrays zu verwenden (oder tatsächlich bereits mit Numpy-Arrays zu tun haben ...), ist hier eine weitere gute Lösung:
Ich habe es hier gefunden: http://scienceoss.com/sort-one-list-by-another-list/
quelle
sortedArray1= array1[array2.argsort()]
. Dies macht es auch einfach, mehrere Listen nach einer bestimmten Spalte eines 2D-ArrayssortedArray1= array1[array2[:,2].argsort()]
zu sortieren : z. B. Array1 (das mehrere Spalten haben kann) nach den Werten in der dritten Spalte von Array2 zu sortieren.Die naheliegendste Lösung für mich ist die Verwendung des
key
Schlüsselworts arg.Beachten Sie, dass Sie dies zu einem Einzeiler kürzen können, wenn Sie Folgendes möchten:
quelle
Ich bin tatsächlich hierher gekommen, um eine Liste nach einer Liste zu sortieren, in der die Werte übereinstimmen.
quelle
index
führt eine O (N) -Suchelist_a
durch, die zu einerO(N² log N)
Sortierung führt.more_itertools
hat ein Werkzeug zum parallelen Sortieren von Iterables:Gegeben
Demo
quelle
Ich mag eine Liste sortierter Indizes. Auf diese Weise kann ich jede Liste in derselben Reihenfolge wie die Quellliste sortieren. Sobald Sie eine Liste mit sortierten Indizes haben, reicht ein einfaches Listenverständnis aus:
Beachten Sie, dass die sortierte Indexliste auch mit abgerufen werden kann
numpy.argsort()
.quelle
Eine weitere Alternative, bei der mehrere Antworten kombiniert werden.
Um für Python3 zu arbeiten:
quelle
zip, sortiere nach der zweiten Spalte, gib die erste Spalte zurück.
quelle
list(zip(*sorted(zip(X,Y), key=operator.itemgetter(1))))[0]
Ein schneller Einzeiler.
Angenommen, Sie möchten, dass Liste a mit Liste b übereinstimmt. B.
Dies ist hilfreich, wenn Sie eine kleinere Liste mit größeren Werten bestellen müssen. Angenommen, die größere Liste enthält alle Werte in der kleineren Liste, kann dies durchgeführt werden.
quelle
X
und versuchtY
?index
führt eine O (N) -Suchelist_b
durch, die zu einerO(N² log N)
Sortierung führt.Sie können eine erstellen
pandas Series
, indem Sie die Primärliste alsdata
und die andere Liste als verwendenindex
und dann einfach nach dem Index sortieren:Ausgabe:
quelle
Hier ist die Antwort von Whatangs, wenn Sie beide sortierten Listen (python3) erhalten möchten.
Denken Sie daran, Zx und Zy sind Tupel. Ich wandere auch, wenn es einen besseren Weg gibt, das zu tun.
Warnung: Wenn Sie es mit leeren Listen ausführen, stürzt es ab.
quelle
Ich habe eine allgemeinere Funktion erstellt, die mehr als zwei Listen basierend auf einer anderen sortiert, inspiriert von @ Whatangs Antwort.
quelle
Um eindeutige Werte in zu erhalten
list2
So finden Sie die Position des Index in
list2
Die Position des Index in
list2
wird mit verfolgtcur_loclist
[0, 3, 7, 1, 2, 4, 8, 5, 6]
quelle
Dies ist eine alte Frage, aber einige der Antworten, die ich gepostet sehe, funktionieren nicht wirklich, weil sie
zip
nicht skriptfähig sind. Andere Antworten störten nichtimport operator
und bieten hier weitere Informationen zu diesem Modul und seinen Vorteilen.Es gibt mindestens zwei gute Redewendungen für dieses Problem. Beginnend mit der von Ihnen angegebenen Beispieleingabe:
Verwenden der Redewendung " Dekorieren-Sortieren-Nichtdekorieren "
Dies ist auch als Schwartzian_transform nach R. Schwartz bekannt, der dieses Muster in den 90er Jahren in Perl populär machte:
Beachten Sie, dass in diesem Fall
Y
undX
lexikographisch sortiert und verglichen werden. Das heißt, die ersten Elemente (vonY
) werden verglichen; und wenn sie gleich sind, werden die zweiten Elemente (vonX
) verglichen und so weiter. Dies kann zu Instabilitäten führen Ausgaben führen, es sei denn, Sie geben die ursprünglichen Listenindizes für die lexikografische Reihenfolge an, um Duplikate in ihrer ursprünglichen Reihenfolge zu halten.Unter Verwendung des
operator
ModulsAuf diese Weise können Sie direkter steuern, wie die Eingabe sortiert wird, sodass Sie die Sortierstabilität erhalten, indem Sie einfach den spezifischen Schlüssel angeben, nach dem sortiert werden soll. Weitere Beispiele finden Sie hier .
quelle