Hallo!
Ich stehe for folgendem Problem:
ich habe ein ConfigParser objekt, das z.B. folgendes file (gekürzt) einliest:
[EtnProcesses]
existent = true
editable = true
type = text
mandatoryToFill = true
value =
defaultValue =
sequenceNumber = 2
[AllProcesses]
existent = true
editable = true
type = text
mandatoryToFill = true
value =
defaultValue =
sequenceNumber = 3
[processes]
existent = true
editable = true
type = text
mandatoryToFill = true
value =
defaultValue =
sequenceNumber = 1
und möchte eine Liste haben, die die sectionNames des ConfigParsers nach der option sequenceNumber sortiert enthält: sprich sie sollte so aussehen:
"processes", "EtnProcesses", "AllProcesses"
Da gibt's bestimmt eine elegante Lösung - nur komm ich nicht drauf...
danke im voraus
Sortieren nach options in einem ConfigParser
Japp, ist sogar recht einfach:
Config:
Code:
Ausgabe:
Man könnte es sicherlich auch mit einer Lambda Funktion realisieren, darauf hatte ich aber keinen Bock.
Weitere Informationen: [wiki]Sortierungs-Tutorium[/wiki]
MfG EnTeQuAk
Config:
Code: Alles auswählen
[EtnProcesses]
existent = true
editable = true
type = text
mandatoryToFill = true
value = none
defaultValue =
sequenceNumber = 2
[AllProcesses]
existent = true
editable = true
type = text
mandatoryToFill = true
value = none
defaultValue = none
sequenceNumber = 3
[tester]
sequenceNumber = 5
[processes]
existent = true
editable = true
type = text
mandatoryToFill = true
value = none
defaultValue = none
sequenceNumber = 1
Code: Alles auswählen
#-*- coding: utf-8 -*-
from ConfigParser import ConfigParser
config = ConfigParser()
config.read('t.ini')
numbers = list()
for section in config.sections():
number = config.get(section, 'sequenceNumber')
numbers.append((section, number))
def sorter(x, y):
if x[1] < y[1]:
return -1
elif x[1] > y[1]:
return 1
else:
return 0
numbers.sort(sorter)
print numbers
Code: Alles auswählen
[EnTeQuAk@ente-lappi development]$ python t.py
[('processes', '1'), ('EtnProcesses', '2'), ('AllProcesses', '3'), ('tester', '5')]
Weitere Informationen: [wiki]Sortierungs-Tutorium[/wiki]
MfG EnTeQuAk
- veers
- User
- Beiträge: 1219
- Registriert: Mittwoch 28. Februar 2007, 20:01
- Wohnort: Zürich (CH)
- Kontaktdaten:
Das geht noch viel einfacher
// ungetestet
..wird aber je nach Implementierung von config.getint eher langsam sein.
Code: Alles auswählen
sections = sorted(config.sections(), lambda x, y:
cmp(config.getint(x, 'sequenceNumber'), config.getint(y, 'sequenceNumber'))
..wird aber je nach Implementierung von config.getint eher langsam sein.
Zuletzt geändert von veers am Mittwoch 8. August 2007, 17:33, insgesamt 2-mal geändert.
@EnTeQuAk: Man sollte auf jeden Fall `getint()` statt `get()` benutzen sonst gibt's beim sortieren falsche Ergebnisse wenn es Zahlen mit unterschiedlicher Ziffernanzahl gibt.
`sorter()` ist viel zu kompliziert, die `cmp()`-Funktion macht das alles schon:
Man sollte aber lieber eine `key`-Funktion statt einer `cmp`-Funktion angeben, weil das schneller ist. Oder die Tupel andersherum anlegen, also mit der Nummer als erstes Element ─ dann braucht man gar keine zusätzliche Funktion, sondern kann einfach so sortieren.
`sorter()` ist viel zu kompliziert, die `cmp()`-Funktion macht das alles schon:
Code: Alles auswählen
def sorter(x, y):
return cmp(x[1], y[1])
Code: Alles auswählen
from ConfigParser import ConfigParser
from operator import itemgetter
def main():
config = ConfigParser()
config.read('test.ini')
print map(itemgetter(1),
sorted((config.getint(section, 'sequenceNumber'), section)
for section in config.sections()))