sqlite-Abfrage in Dictionary umwandeln

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Klappstuhl
User
Beiträge: 11
Registriert: Dienstag 5. Januar 2010, 13:55

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 :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Klappstuhl
User
Beiträge: 11
Registriert: Dienstag 5. Januar 2010, 13:55

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann ersetze doch mal int durch list und += durch ein append.
Das Leben ist wie ein Tennisball.
Klappstuhl
User
Beiträge: 11
Registriert: Dienstag 5. Januar 2010, 13:55

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Antworten