Seite 1 von 1

Liste sortieren

Verfasst: Freitag 7. August 2009, 13:33
von Andyh
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

Verfasst: Freitag 7. August 2009, 13:39
von HerrHagen

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'}]

Verfasst: Freitag 7. August 2009, 13:40
von derdon

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

Verfasst: Freitag 7. August 2009, 13:48
von Andyh
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

Verfasst: Freitag 7. August 2009, 16:53
von sma
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