Python: Listen gleichwertig sortieren lassen?

1 Antwort

Von Experte ralphdieter bestätigt

Man könnte die Listen zusammenzippen, dann sortieren und anschließend wieder in getrennte Listen zippen. [Das ist quasi wie ein „decorate-sort-undecorate“.]

Beispielsweise so...

A = ['1_1', '1_6', '1_3']
B = ['x', 'b', 's']
C = ['p', 'i', 'j']

A, B, C = zip(*sorted(zip(A, B, C)))

Dabei wird dann...

A = ('1_1', '1_3', '1_6')
B = ('x', 's', 'b')
C = ('p', 'j', 'i')

Bzw. wenn du wieder Listen, statt Tupel haben möchtest... Dann noch die list-Funktion dranmappen...

A = ['1_1', '1_6', '1_3']
B = ['x', 'b', 's']
C = ['p', 'i', 'j']

A, B, C = map(list, zip(*sorted(zip(A, B, C))))

HagbardCeline88 
Fragesteller
 22.03.2023, 21:49

Danke, ich probier das mal aus. Würde jetzt aber noch nen String vor dem jeweiligen Element stehen, würde dieser entsprechend alphabetischer Sortierung mir einbezogen oder?

0
mihisu  22.03.2023, 22:01
@HagbardCeline88

Naja. Das sortiert so im Moment nach den Elementen der Liste A.

Wenn da in den in A enthaltenen Strings vorne unterschiedliche Sachen stehen, ... Ja, dann wird das aufgrund der alphabetischen Sortierung zuerst nach dem vorderen Teil sortiert.

Du könntest bei dem sorted() aber beispielsweise noch eine Key-Function angeben, die dir den entsprechenden Teil rausholt, nach dem sortiert werden soll.

Beispielsweise wenn du dort einen Unterstrich drin hast und nur nach dem Teil nach dem Unterstrich sortiert werden soll...

A = ['1_1', '1_6', '1_3', '2_4']
B = ['x', 'b', 's', 't']
C = ['p', 'i', 'j', 'k']

A, B, C = map(list, zip(*sorted(zip(A, B, C), key=lambda L: L[0].split('_')[-1])))

print(A)  # ['1_1', '1_3', '2_4', '1_6']
print(B)  # ['x', 's', 't', 'b']
print(C)  # ['p', 'j', 'k', 'i']
1
HagbardCeline88 
Fragesteller
 23.03.2023, 17:24
@HagbardCeline88

Hm danke.,,. also das Problem ist, es soll nicht nur sortiert werden, soindern nach dem das abgeknipst wurde soll es wenn es fertig ist wieder dahin wo es vorher war. geht das auch ?

0
mihisu  23.03.2023, 17:39
@HagbardCeline88

Sorry, aber ich verstehe nicht.

Was wurde denn da „abgeknipst“? Und wo soll das wieder hin?

0
HagbardCeline88 
Fragesteller
 23.03.2023, 18:02
@mihisu

Angenommen man hat die A = ['AString1_1', 'BString1_6', 'FString1_3', 'DString2_4']

man sortiert nun zu ['1_1', '1_3', '2_4', '1_6'] , nun soll aber jedes Element wie vorher stehen (nur eben sortiert), also ['AString1_1', 'FString1_3', 'DString2_4', 'BString1_6']

0
HagbardCeline88 
Fragesteller
 24.03.2023, 06:36
@mihisu

Also was der etwa macht ist die 13 vor die 2 zu packen leider :(. ich muss aber auch sagen ich versteh den teil mit dem key lambda l etc. auch nicht :(

0
HagbardCeline88 
Fragesteller
 24.03.2023, 07:13
@HagbardCeline88

Beispiel der Sortierung die ich bekomme; für mich entscheidend sind die Werte nach dem '-' , also es soll der Reihenfolge 1, 2, 3, 10, 11, 12 etc. und nicht 10,11,12,1,2,3 etc. .. Ich denke mal es bedarf nur ne kleine Änderung damit das passt, aber ich finde die Stelle nicht. Hatte nun schon gedacht es liegt daran das es nicht 01, 02, 03, 10,11,12 oder so heißt, aber das hats auch net gelöst (ohne die 0 vor Zahlen "der Länge 1" ist die Sortierung die gleiche s.u.). Irgendwie scheint er nicht zu wissen, dass also etwa die 10 größer als die 1 ist o0

 2301239k-12  2301239k-12

 2301239a-13  2301239a-13

 2301239k-14  2301239k-14

 2301239k-25  2301239k-25

 2301239d-27 2301239d-27

2301239k-28  2301239k-28

 2301239a-02  2301239a-02

2301239a-03  2301239a-03

 2301239b-03 2301239b-03

0
mihisu  24.03.2023, 15:59
@HagbardCeline88

Also, wenn für dich die Werte hinter dem '-' entscheidend sind, musst du natürlich bei dem Split, den ich in der Key-Function definiert habe, an '-' statt an '_' splitten. Wenn man das ändert, sollte es passen.

Beispiel:

A = ['2301239k-12', '2301239a-13', '2301239k-14', '2301239k-25', '2301239d-27', '2301239k-28', '2301239a-02', '2301239a-03', '2301239b-03']
B = ['b01', 'b02', 'b03', 'b04', 'b05', 'b06', 'b07', 'b08', 'b09']
C = ['c01', 'c02', 'c03', 'c04', 'c05', 'c06', 'c07', 'c08', 'c09']

print("Davor:")
print(f"A = {A}")
print(f"B = {B}")
print(f"C = {C}")

A, B, C = map(list, zip(*sorted(zip(A, B, C), key=lambda L: L[0].split('-')[-1])))

print("Danach:")
print(f"A = {A}")
print(f"B = {B}")
print(f"C = {C}")

Und, ja. In dem Beispiel würde eine alphabetisch sortiert werden. Demnach würde beispielsweise ein '...-14' vor ein '...-2' sortiert werden. Dafür könnte man das noch weiter verfeinern. Wenn du da beispielsweise nur Zahlen hinter dem '-' erwartest, so könnte man einfach den hinteren Teil mit int() in eine Ganzzahl casten und dann das entsprechend der Zahlen sortieren. Dann ist eine 2 beispielsweise vor einer 14.

Beispiel:

A = ['2301239k-12', '2301239a-13', '2301239k-14', '2301239k-25', '2301239d-27', '2301239k-28', '2301239a-2', '2301239a-3', '2301239b-3']
B = ['b01', 'b02', 'b03', 'b04', 'b05', 'b06', 'b07', 'b08', 'b09']
C = ['c01', 'c02', 'c03', 'c04', 'c05', 'c06', 'c07', 'c08', 'c09']

print("Davor:")
print(f"A = {A}")
print(f"B = {B}")
print(f"C = {C}")

A, B, C = map(list, zip(*sorted(zip(A, B, C), key=lambda L: int(L[0].split('-')[-1]))))

print("Danach:")
print(f"A = {A}")
print(f"B = {B}")
print(f"C = {C}")
0
mihisu  24.03.2023, 16:05
@HagbardCeline88
ich muss aber auch sagen ich versteh den teil mit dem key lambda l etc. auch nicht

Der sorted()-Funktion kann man eine Key-Function als Parameter übergeben. Die Elemente der zur sortierenden Liste werden in die Key-Funktion gesteckt, und entsprechend der Werte, die da als Schlüsselwerte rauskommen, wird die Liste dann sortiert.

Im konkreten Fall (im ursprünglichen Beispiel) wird für jedes Element L von zip(A, B, C) der erste Wert L[0] genommen. Das sind im Beispiel die Strings '1_1', '1_3', '2_4', '1_6'. Mit der split()-Methode werden dann bei L[0].split('_') diese Strings an jedem '_' aufgesplittet. Aus '1_3' wird dann beispielsweise ('1', '3'). Mit dem Index [-1] dahinter wird dann der letzte Teilstring rausgesucht, bei '1_3' dann also beispielsweise der String '3' hinter dem letzten '_'. Und danach wird dann sortiert.

0