Liste sortieren

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
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Ich habe sowas:

Code: Alles auswählen

[
  {
    "feld_name" : "eingabe1",
    "wichtig" : 1,  
  },
  {
    "feld_name" : "eingabe5",
    "wichtig" : 5,  
  },
  {
    "feld_name" : "eingabe2",
    "wichtig" : 2,  
  },
  {
    "feld_name" : "eingabe7",
    "wichtig" : 7,  
  },
]

und brauche sowas:

Code: Alles auswählen

[
  "eingabe7",
  "eingabe5",
  "eingabe2",
  "eingabe1",
]
der "key" "feld_name"(ACHTNUNG name ist variabel) muss nach "wichtig" sortiert werden

Außer seeehr komplexen Sachen fällt mir da nichts ein.
Da gibt sicher auch wieder was kitsch(geschicktes).

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Code: Alles auswählen

>>> x = [ 
  { 
    "feld_name" : "eingabe1", 
    "wichtig" : 1,  
  }, 
  { 
    "feld_name" : "eingabe5", 
    "wichtig" : 5,  
  }, 
  { 
    "feld_name" : "eingabe2", 
    "wichtig" : 2,  
  }, 
  { 
    "feld_name" : "eingabe7", 
    "wichtig" : 7,  
  }, 
]
>>> x
[{'wichtig': 1, 'feld_name': 'eingabe1'}, {'wichtig': 5, 'feld_name': 'eingabe5'}, {'wichtig': 2, 'feld_name': 'eingabe2'}, {'wichtig': 7, 'feld_name': 'eingabe7'}]
>>> sorted(x, lambda a, b: b["wichtig"] - a["wichtig"])
[{'wichtig': 7, 'feld_name': 'eingabe7'}, {'wichtig': 5, 'feld_name': 'eingabe5'}, {'wichtig': 2, 'feld_name': 'eingabe2'}, {'wichtig': 1, 'feld_name': 'eingabe1'}]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

>>> foo = [
...   {
...     "feld_name" : "eingabe1",
...     "wichtig" : 1, 
...   },
...   {
...     "feld_name" : "eingabe5",
...         "wichtig" : 5, 
...   },
...   {
...     "feld_name" : "eingabe2",
...     "wichtig" : 2, 
...   },
...   {
...     "feld_name" : "eingabe7",
...     "wichtig" : 7, 
...   },
... ]
>>> 
>>> import operator as op
>>> for dic in sorted(foo, key=op.itemgetter("wichtig"), reverse=True):
...     for key, value in dic.iteritems():
...         if key == "feld_name":
...             print value
... 
eingabe7
eingabe5
eingabe2
eingabe1
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Wahnsinn wie schnell das ging!

hab's mir fast gedacht das es so einen einfacheren weg gibt als das was ich mir da überlegt habe.

Besten Dank

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wenn `e` für die Eingabedaten steht, dann

Code: Alles auswählen

print [o["feld_name"] for o in sorted(e, key=lambda o:o["wichtig"], reverse=True)]
Das ist etwas effizienter als die `cmp`-Funktion zu benutzen. Außerdem sollte ja eine Liste mit nur den Begriffen geliefert werden, daher das abschließende Filtern.

Stefan
Antworten