Seite 1 von 1

Parsing einer Python List mit 1 Tuple

Verfasst: Mittwoch 26. Februar 2014, 16:16
von schms
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"

Re: Parsing einer Python List mit 1 Tuple

Verfasst: Mittwoch 26. Februar 2014, 16:29
von noisefloor
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

Re: Parsing einer Python List mit 1 Tuple

Verfasst: Mittwoch 26. Februar 2014, 16:40
von Sirius3
@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]))

Re: Parsing einer Python List mit 1 Tuple

Verfasst: Mittwoch 26. Februar 2014, 18:46
von /me
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?".

Re: Parsing einer Python List mit 1 Tuple

Verfasst: Donnerstag 27. Februar 2014, 16:23
von schms
Ein grosses Dankeschön für das Feedback.