Dictionary sortiert ausgeben.

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
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Mittwoch 18. Februar 2015, 14:50

Hallo,
Ich weis, dass man ein Dictionary nicht sortieren kann, ich möchte es jedoch sortiert ausgeben. Aufgebaut ist es wie folgt:
{"name": [namedtuple(beispiel1='222", beispiel2 = '333'), versionskontrollsystem]}
Sprich ein Dictionary, das als Value eine Liste hat, dass ein namedtuple und einen string enthällt.

Jetzt möchte ich das Dictionary sortiert ausgeben. Aber nicht alphabetisch nach dem key namen sondern nach einem Wert aus dem namedtuple, zum Beispiel "beispiel1".

Wie realisiere ich das am Besten? Ich hoffe ich konnte meine Frage gut schildern, vielen Dank schonmal :)
Benutzeravatar
sparrow
User
Beiträge: 1756
Registriert: Freitag 17. April 2009, 10:28

Mittwoch 18. Februar 2015, 14:53

Du kannst problemlos die die keys eines dicts sortieren, über die daraus resultierende Liste iterieren und die entsprechenden values passend zum Key aus dem dict abfragen.
Die krux in diesem Fall ist der Sortierschlüssel nach dem sortiert werden soll. Den kannst du aber bei sorted() problemlos mit angeben.
Für ein Beispiel braucht es aber mehr als einen Eintrag aus dem dict und eine konkrete Problemstellung.
BlackJack

Mittwoch 18. Februar 2015, 14:59

@nfehren: Am besten sortierst Du die Schlüssel/Wert-Paare (`dict.iteritems()` oder `dict.items()`) mit einem geeigneten `key`-Argument für `sorted()` oder `list.sort()`. Im Beispiel beispielsweise ``lambda x: x[1].beispiel1``.
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Mittwoch 18. Februar 2015, 15:13

BlackJack hat geschrieben:@nfehren: Am besten sortierst Du die Schlüssel/Wert-Paare (`dict.iteritems()` oder `dict.items()`) mit einem geeigneten `key`-Argument für `sorted()` oder `list.sort()`. Im Beispiel beispielsweise ``lambda x: x[1].beispiel1``.
Hat geklappt, super. Vielen Dank ;)
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Donnerstag 19. Februar 2015, 09:59

Ich hab jedoch jetzt ein anderes Problem. Es wird zwar nach dem richtigen Wert sortiert jedoch nicht der numerischen Größe nach. Das sieht dann zB so aus:


Package: odin | Rank: 5521 | Inst: 323 | Vote: 41 | Vcs: Git
Package: imagemagick | Rank: 56 | Inst: 704649 | Vote: 62376 | Vcs: Svn
Package: muscle | Rank: 5669 | Inst: 556 | Vote: 38 | Vcs: Svn
Package: tm-align | Rank: 5783 | Inst: 451 | Vote: 20 | Vcs: Svn
Package: ncbi-blast+ | Rank: 5857 | Inst: 363 | Vote: 43 | Vcs: Svn

(sortiert wird nach Rank)
muss ich noch ein Argument der sorted Funktion hinzufügen?
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Donnerstag 19. Februar 2015, 10:08

Der "Rank" ist scheinbar ein string, du musst ihn zu einem int umwandeln
Benutzeravatar
sparrow
User
Beiträge: 1756
Registriert: Freitag 17. April 2009, 10:28

Donnerstag 19. Februar 2015, 10:09

Für das Sortieren die Zeichenketten in Zahlen wandeln:

Code: Alles auswählen

>>> d
['5521', '56', '5669', '5783', '5857']
>>> sorted(d)
['5521', '56', '5669', '5783', '5857']
>>> sorted(d, key=lambda x: int(x))
['56', '5521', '5669', '5783', '5857']
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Donnerstag 19. Februar 2015, 10:13

Super, funktioniert perfekt. Vielen Dank nochmal für die schnellen Antworten :)
EyDu
User
Beiträge: 4874
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 19. Februar 2015, 10:28

Der Umweg ist über lambda ist nicht nötig, für den Schlüssel kann direkt int verwendet werden.

Code: Alles auswählen

sorted(d, key=int)
Das Leben ist wie ein Tennisball.
Antworten