Dict sortieren nach...

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.
ich1988

Dict sortieren nach...

Beitragvon ich1988 » Sonntag 11. Dezember 2005, 01:21

hallo!
hab ein dict mit werten wie {"wort_als_string":"anzahl_des_worter_als_string").
nun wäre es toll, wenn das dict nach der anzahl der wörter sortiert würde; also nach inhalt des feldes nr2...
danke für Eure hilfe
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Sonntag 11. Dezember 2005, 09:34

Du kannst ein dict nicht sortieren, weil es intern als Hash gespeichert wird (google wird dir da helfen).
Stell es dir wie eine Mathematische Menge vor: Es gibt nirgends iInformationen über die Reihenfolge.

Du kannst aber z.B. eine Liste aus allesn Schlüsseln machen und diese sortieren:

Code: Alles auswählen

sorted_keys = sorted(mein_dict.keys())
for k in sorted keys:
  print "Wort:", k, "Anzahl:", mein_dict[k]
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

Beitragvon helmut » Sonntag 11. Dezember 2005, 10:15

Hallo Gast,

die Ausgabe, sortiert nach den dict-Werten, ist so möglich:

Code: Alles auswählen

zahlen = {'1':'eins',
               '2':'zwei',
               '3':'drei',
               '4':'vier',
               '5':'fuenf'}

#Schluessel und Werte vertauschen
r_zahlen={}
for k in zahlen.keys():
    r_zahlen[zahlen[k]]=k

v_list = zahlen.values()
v_list.sort()

#Ausgabe der Werte, sortiert in alphabetischer Reihenfolge der Werte
for v in v_list:
    print r_zahlen[v], v


Gruss Helmut

Edit (Leonidas): Code in Python-Tags gesetzt.
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

Beitragvon Ronnie » Sonntag 11. Dezember 2005, 10:32

Eine Liste von Tuplen wäre vieleicht hilfreicher als ein Dictionary:

Code: Alles auswählen

counted = { 'red': 12, 'green': 9, 'blue': 17 }

def by_count (a, b):
   if counted[a] < counted[b]:
      return -1
   elif counted[a] == counted[b]:
      return 0
   else:
      return 1

L = counted.keys
L.sort(cmp=by_count)

ordered = [(k, counted[k]) for k in L ]


Edit (Leonidas): Code in Python-Tags gesetzt.
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

Beitragvon Ronnie » Sonntag 11. Dezember 2005, 12:34

Oder nochmal etwas schöner:

Code: Alles auswählen

counted = { 'red': 12, 'green': 9, 'blue': 17 }
L = counted.items()

def by_second(j):
   return j[1]

L.sort(key=by_second)
BlackJack

Beitragvon BlackJack » Sonntag 11. Dezember 2005, 22:07

helmut hat geschrieben:

Code: Alles auswählen

#Schluessel und Werte vertauschen
r_zahlen={}
for k in zahlen.keys():
    r_zahlen[zahlen[k]]=k


Das funktioniert aber nur wenn die Werte auch alle eindeutig sind. ich1988 hatte im Beispiel aber ein Dictionary mit Worten und Anzahlen. Der Satz "Python ist cool" würde dann zu:

Code: Alles auswählen

histogram = { 'Python': 1, 'cool': 1, 'ist': 1 }


Das Dictionary lässt sich schlecht umdrehen.

Zu Ronnies Lösung: `by_second` kann man durch `operator.itemgetter(1)` ersetzen.
ich1988

Beitragvon ich1988 » Montag 12. Dezember 2005, 19:39

danke
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Beitragvon sea-live » Montag 28. April 2008, 18:09

mit python 2.5
gehts auch so

Code: Alles auswählen

def main():
    data = [{'Volume': '1285500', 'Adj Close': '9.84', 'High': '10.18', 'Low': '9.70', 'Date': '2008-04-25', 'Close': '9.84', 'Open': '9.74'},
    {'Volume': '1121700', 'Adj Close': '9.67', 'High': '9.70', 'Low': '9.36', 'Date': '2008-04-24', 'Close': '9.67', 'Open': '9.45'},
    {'Volume': '1513700', 'Adj Close': '9.41', 'High': '9.45', 'Low': '8.95', 'Date': '2008-04-23', 'Close': '9.41', 'Open': '8.98'},
    {'Volume': '601800', 'Adj Close': '9.03', 'High': '9.09', 'Low': '8.87', 'Date': '2008-04-22', 'Close': '9.03', 'Open': '8.90'},
    {'Volume': '481100', 'Adj Close': '8.87', 'High': '8.99', 'Low': '8.82', 'Date': '2008-04-21', 'Close': '8.87', 'Open': '8.95'},
    {'Volume': '672800', 'Adj Close': '8.82', 'High': '8.94', 'Low': '8.65', 'Date': '2008-04-17', 'Close': '8.82', 'Open': '8.89'},
    {'Volume': '485000', 'Adj Close': '8.89', 'High': '8.94', 'Low': '8.78', 'Date': '2008-04-18', 'Close': '8.89', 'Open': '8.90'},
    {'Volume': '753300', 'Adj Close': '8.81', 'High': '8.81', 'Low': '8.51', 'Date': '2008-04-16', 'Close': '8.81', 'Open': '8.63'}]

    sortiert_daten = sorted(data, key=lambda x: x['Date'])   
    print 'Ergebniss'
    print sortiert_daten
   
main()
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Montag 28. April 2008, 18:33

Dir ist schon klar, von wann der Thread ist, oder :-) ? Außerdem würde man statt deinem Lambda-Ausdruck 'operator.itemgetter("Date")' verwenden.
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Beitragvon ne0h » Montag 28. April 2008, 18:34

2 1/2 Jahre später... ?

LOL :lol:


ne0h
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Beitragvon sea-live » Montag 28. April 2008, 18:59

ich war auf der suche nach einer lösung und binn auf diesen tread gestossen

da ich eine lösung für dict listen habe habe ich sie hier reingestellt

gibts nen besseren thread in sachen dict sort

die suche lieferte nur den hier

wo muss das hier 'operator.itemgetter("Date")' hin
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Montag 28. April 2008, 19:02

Code: Alles auswählen

import operator
data.sort(key=operator.itemgetter("Date"))
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Beitragvon sea-live » Montag 28. April 2008, 19:08

EyDu hat geschrieben:

Code: Alles auswählen

import operator
data.sort(key=operator.itemgetter("Date"))


wo liegt der vorteil wenn ich dazu ein modul brauche
desweiteren

keine funktion
mit deinem code
meiner ausgeklammert funzt

Code: Alles auswählen

import operator
def main():
    data = [{'Volume': '1285500', 'Adj Close': '9.84', 'High': '10.18', 'Low': '9.70', 'Date': '2008-04-25', 'Close': '9.84', 'Open': '9.74'},
    {'Volume': '1121700', 'Adj Close': '9.67', 'High': '9.70', 'Low': '9.36', 'Date': '2008-04-24', 'Close': '9.67', 'Open': '9.45'},
    {'Volume': '1513700', 'Adj Close': '9.41', 'High': '9.45', 'Low': '8.95', 'Date': '2008-04-23', 'Close': '9.41', 'Open': '8.98'},
    {'Volume': '601800', 'Adj Close': '9.03', 'High': '9.09', 'Low': '8.87', 'Date': '2008-04-22', 'Close': '9.03', 'Open': '8.90'},
    {'Volume': '481100', 'Adj Close': '8.87', 'High': '8.99', 'Low': '8.82', 'Date': '2008-04-21', 'Close': '8.87', 'Open': '8.95'},
    {'Volume': '672800', 'Adj Close': '8.82', 'High': '8.94', 'Low': '8.65', 'Date': '2008-04-17', 'Close': '8.82', 'Open': '8.89'},
    {'Volume': '485000', 'Adj Close': '8.89', 'High': '8.94', 'Low': '8.78', 'Date': '2008-04-18', 'Close': '8.89', 'Open': '8.90'},
    {'Volume': '753300', 'Adj Close': '8.81', 'High': '8.81', 'Low': '8.51', 'Date': '2008-04-16', 'Close': '8.81', 'Open': '8.63'}]

    #sortiert_daten = sorted(data, key=lambda x: x['Date'])   
    sortiert_daten = data.sort(key=operator.itemgetter("Date"))
    print 'Ergebniss'
    print sortiert_daten
   
main()
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Beitragvon Trundle » Montag 28. April 2008, 19:46

sea-live hat geschrieben:keine funktion
mit deinem code
meiner ausgeklammert funzt

`sort` sortiert ja auch *IN PLACE*. Folglich wird `data` direkt verändert und es wird `None` zurückgegeben. Du müsstest also ``print data`` machen oder ``sortiert_daten = sorted(data, key=operator.itemgetter("Date"))``

Edit: Vergessene Klammer hinzugefügt.
Zuletzt geändert von Trundle am Montag 28. April 2008, 21:09, insgesamt 1-mal geändert.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 28. April 2008, 20:43

sea-live hat geschrieben:wo liegt der vorteil wenn ich dazu ein modul brauche

Weil die Funktionalität von itemgetter dokumentiert ist und man nicht überlegen muss was irgendwelche Funktionen machen. Außerdem ist er womöglich auch schneller.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder