Parsing einer Python List mit 1 Tuple

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
schms
User
Beiträge: 5
Registriert: Dienstag 2. Juni 2009, 08:21

Eine Datenbankabfrage mit pyodbc ergibt folgende Struktur (in Variable row):

[ ( u'STRING_A' , u'STRING_B' , u'STRING_C' , u'STRING_D ) ]

Nach meinem Verständnis ist die Struktur eine Liste [..] mit 1 Tuple (..).

Ich wollte dann die einzelnen Elemente (STRING_A, STRING_B, usw.) einem Python Dictionary
übergeben und habe bis jetzt nur den folgenden sehr komplexen Ansatz gefunden (x[0] entspricht STRING_A , x[1] entspricht STRING_B, usw.).
Gibt es einfachere Lösungen ?

(..)
row = cursor.fetchall()
..
dict = {}
dict['name'] = ''.join([x[0] for x in row])
dict['description'] = ''.join([x[1] for x in row])
dict['os'] = ''.join([x[2] for x in row])
dict['product'] = ''.join([x[3] for x in row])


Das Resultat ist dann ein dict{} mit

dict['name'] = ''STRING_A"
dict['description'] = ''STRING_B"
dict['os'] = ''STRING_C"
dict['product'] = ''STRING_D"
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Code: Alles auswählen

>>> liste = [('foo','bar','spam','egg')]
>>> my_dict = {}
>>> my_dict['a'], my_dict['b'], my_dict['c'], my_dict['d'] = liste[0]
>>> my_dict
{'a': 'foo', 'c': 'spam', 'b': 'bar', 'd': 'egg'}
Was du auch mal in der Doku nachschauen könntest ist, ob pyodbc nicht direkt Dicts zurück liefern kann. Manche Datenbankanbindungen können das, AFAIR...

Gruß, noisefloor
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@schms: row[0] ist das erste Element Deiner Liste, und damit das Tuple, "for x in row" geht ja auch nur die Elemente der Liste durch, und da die Liste nur ein Element enthält, entspricht das so ziemlich x=row[0].
Um daraus ein Dict zu machen gibt es zip:

Code: Alles auswählen

data = dict(zip(['name', 'desc','os','product'], row[0]))
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

schms hat geschrieben:dict['name'] = ''.join([x[0] for x in row])
Heiliger Bimbam! Wie bist du denn auf so etwas gekommen?

Eine leichte Vereinfachung läge darin, die Umwandlung in eine Liste sein zu lassen und einfach einen Generatorausdruck zu nehmen.

Code: Alles auswählen

dic['name'] = ''.join(x[0] for x in row)
In diesem konkreten Fall einer Liste mit nur einem Tupel darin geht es aber natürlich viel einfacher.

Code: Alles auswählen

dic['name'] = row[0][0]
Du solltest übrigens deine Bezeichner nicht so nennen wie eingebaute Funktionen. dict ist ein sehr unglücklich gewählter Name.

Eine mögliche Lösung für dein Dictionary-Problem findest du bei Stackoverflow unter "More general way of generating PyODBC queries as a dict?".
schms
User
Beiträge: 5
Registriert: Dienstag 2. Juni 2009, 08:21

Ein grosses Dankeschön für das Feedback.
Antworten