Liste aus Strings bezüglich Liste aus Zahlen ordenen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bjoernh
User
Beiträge: 20
Registriert: Donnerstag 27. Mai 2010, 15:45

Hallo,
Ich habe eine Liste von strings:

Code: Alles auswählen

my_list = ["hi1", ...., "hi10"]
und ordne den Einträgen ganze Zahlen zu. Zum Beispiel:

Code: Alles auswählen

my_numbers = [1,10,2,9,3,8,4,7,5,6]
Etwa vermittels my_numbers.sort() erhalte ich eine Ordnung der Zahlen.
Ich möchte jetzt, dass die strings gemäß der Ordnung der Zahlen geordnet werden. Also im obigen Beispiel will ich erhalten:

Code: Alles auswählen

my_sorted_list = ["hi1", "hi3","hi5",...,"hi2"]
:K
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Code: Alles auswählen

>>> s = ["spam", "ham", "eggs"]
>>> t = [3, 2, 1]
>>> 
>>> sorted_list = [i[1] for i in sorted(zip(t, s))]                            
>>> print sorted_list
['eggs', 'ham', 'spam']
Wobei ich darueber nachdenken wurde, lieber eine Liste von Tupel statt zwei separater Listen zu speichern, wenn die Daten zusammengehoeren!
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
bjoernh
User
Beiträge: 20
Registriert: Donnerstag 27. Mai 2010, 15:45

Danke :)
Ich bin blutiger Anfänger, aber ich schau mir mal an, was Tupel überhaupt machen. Aus der Mathematik hab ich im Kopf Menge mit fester Reihenfolge :)
BlackJack

@bjoernh: Stimmt fast -- im Gegensatz zu Mengen kann man einen Wert mehrfach in einem Tupel haben.

Man kann Tupel auch ganz grob als unveränderbare Listen auffassen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wäre das nicht eher ein Einsatz für ein Dictionary? Das Wort "Zuordnung" impliziert das ja geradezu. Für die Sortierung gibts ja durchaus workarounds oder ggf. ab 2.7 (oder 3.x) auch das OrderedDict.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

Hyperion hat geschrieben:Wäre das nicht eher ein Einsatz für ein Dictionary? Das Wort "Zuordnung" impliziert das ja geradezu. Für die Sortierung gibts ja durchaus workarounds oder ggf. ab 2.7 (oder 3.x) auch das OrderedDict.
Ggü. der der Variante mit einer Liste von Tupeln erhält man die Einschränkung, dass die Strings alle untereinander verschieden sein müssen. (Außerdem geht die ursprüngliche Reihenfolge verloren; z.B. ist die Sortierung dann nicht mehr stable.)

Zur Abwechslung mal eine Variante ohne zip:

Code: Alles auswählen

s = ["spam", "ham", "eggs"]
t = [3, 2, 1]
comes_from = sorted(range(len(t)), key=t.__getitem__)
sorted_list = [s[i] for i in comes_from]
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Hyperion hat geschrieben:Für die Sortierung gibts ja durchaus workarounds oder ggf. ab 2.7 (oder 3.x) auch das OrderedDict.
Ein OrderedDict kann man nicht sortieren, eine Liste mit Tupeln ist daher angebrachter.
Antworten