Seite 1 von 1

sqlite-Abfrage in Dictionary umwandeln

Verfasst: Mittwoch 24. Februar 2010, 13:57
von Klappstuhl
Hallo allerseits,

ich lese jetzt hier schon etwas länger mit und mir wurde durch einige Threads schon sehr gut geholfen. Jetzt gerade stehe ich aber vor einem Problem, wo ich mal aktiv Hilfe erbitte.
Ich möchte eine Datenbankabfrage starten in der Form

Code: Alles auswählen

cursor.execute('SELECT * FROM tablename')
Diese Tabelle hat bspw. drei Spalten mit (BenutzerId, Benutzername, ZugriffErlaubt).

Nun bräuchte ich als Ergebnis ein Dictionary der gesamten Tabelle, wobei die jeweiligen Zeilenwerte dann aber Listen sind, also in etwa so:

{"BenutzerId" : [1234, 4321, 1111],
"BenutzerName" : [Helmut, Hans, Barbara],
"ZugriffErlaub" : [1, 0, 1] }

Kann mir hier jemand einen entscheidenden Hinweis geben?

Viele Grüße
Klaus :)

Verfasst: Mittwoch 24. Februar 2010, 15:47
von EyDu
Hallo und willkommen im Forum!

Ich mach es mal kurz:

Code: Alles auswählen

>>> import collections
>>> spam = [1, 2, 3, 1, 2, 4, 5, 1]
>>> eggs = collections.defaultdict(int)
>>> for elem in spam:
...     eggs[elem] += 1
...
>>> eggs
defaultdict(<type 'int'>, {1: 3, 2: 2, 3: 1, 4: 1, 5: 1})
Sebastian

Verfasst: Mittwoch 24. Februar 2010, 16:36
von Klappstuhl
Hi und vielen Dank für Deine Antwort!

Aber entweder stehe ich noch ein wenig auf dem Schlauch, oder ich habe mich mit der Problemstellung falsch ausgedrückt. Ich habe mittlerweile einen Code geschrieben, der funktioniert. Für den würde mich nur vermutlich jeder Python-Programmierer (vermutlich sogar jeder Informatiker) erschlagen:

Code: Alles auswählen

ProvList = self.GetProvId(...) # holt sich die erste Spalte
ProvList = self.ExtrElemFromList(ProvList) # Holt die Werte aus der Liste der Tupel...
ProvName = self.GetProvName(...) # 2. Spalte
ProvName = self.ExtrElemFromList(ProvName)
ProvState = self.GetProvState(...) # 3. Spalte
ProvState = self.ExtrElemFromList(ProvState)
WhitelistDict = {"BenutzerId": ProvList, "BenutzerName": ProvName, "ZugriffErlaubt": ProvState} # hier wird das Dict zusammengefügt
Dabei entsteht in etwa folgende Ausgabe:
{'BenutzerId': [123, 1234], 'BenutzerName': [u'Karl', u'Dall'], 'ZugriffErlaubt': [1, 0]}

Das ist genau das Format, welches ich gerne hätte. Das der Weg dahin aber wohl denkbar schlecht ist, ist mir klar. Mir sind allerdings keine Alternativen eingefallen.

Viele Grüße
Klaus

Verfasst: Mittwoch 24. Februar 2010, 16:39
von EyDu
Dann ersetze doch mal int durch list und += durch ein append.

Verfasst: Mittwoch 24. Februar 2010, 16:55
von Klappstuhl
Hi und nochmals danke!

Das hatte ich so schon ausprobiert und das geht ja auch tendenziell in die richtige Richtung.
Allerdings sieht im konkreten Fall die Ausgabe dann folgendermaßen aus:

defaultdict(<type 'list'>, {(1, 123, u'Karl', 1): [1], (2, 1234, u'Dall', 0): [1]})

Und an der Stelle wüsste ich jetzt wiederum nicht, wie ich da weiter verfahren sollte.

Viele Grüße,
Klaus

Verfasst: Mittwoch 24. Februar 2010, 17:32
von EyDu
Naja, neben einfach nur einsetzen muss man natürlich auch noch ein wenig Gedanken inverstieren ;-)

Code: Alles auswählen

>>> import collections
>>> names = ("ID", "SPAM", "NAME", "ZUGRIFF")
>>> result = [(1, 123, "Karl", 1), (2, 1234, "Dall", 0)]
>>> d = collections.defaultdict(list)
>>> for entry in result:
...     for name, value in zip(names, entry):
...         d[name].append(value)
...
>>> d
defaultdict(<type 'list'>, {'NAME': ['Karl', 'Dall'], 'ID': [1, 2], 'ZUGRIFF': [1, 0], 'SPAM': [123, 1234]})
Ich empfehle dir aber, dass zur Übung noch einmal mit einem "normalen" Dictionary zu implementieren. Einmal mit der get-Methode auf Dictionaries und einmal ohne.

Sebastian