2D Liste dynamisch in Dictionary umwandeln

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
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hallo Leute,

Hab mal wieder ein Problem was sich sicher irgendwie schnell und elegant lösen lässt:

Ich hab eine 2D Liste in welcher der erste Eintrag eine Liste mit den Spaltenüberschriften einer Tabelle ist. Danach kommen die Einträge der Spalten selbst. Ich möchte die Liste in ein Dictionary transformieren, welches als Key die jeweilige Spaltenüberschrift und als item eine Liste mit den Spalteneinträgen hat.

Ich komme irgendwie immer mit den Dimensionen nicht klar. Vielleicht könnt Ihr mir auf die Sprünge mit einem "pythonischen" Ansatz helfen.

Hier meine Beispielliste und meine Zielvorstellung:

Code: Alles auswählen

,
listOrigin = [['id', 'desc', 'data'], [1, 'OS07', 'aaa'], [2, 'AT223', 'bbb'], [3, 'URN7','ccc'], [16, 'MU33','ddd']]

#Zieldictionary
targetDict = {'desc': ['LH007', 'SQ223', 'MSN7', 'MSN33'], 'id': [1, 2, 3, 16], 'data':['aaa','bbb','ccc','ddd']}


Danke,

Johannes
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

So irgendwie:

Code: Alles auswählen

In [8]: targetDict = {}

In [9]: for i in zip(*listOrigin):
   ...:     targetDict[i[0]] = i[1:]
   ...:     

In [10]: targetDict
Out[10]: 
{'data': ('aaa', 'bbb', 'ccc', 'ddd'),
 'desc': ('OS07', 'AT223', 'URN7', 'MU33'),
 'id': (1, 2, 3, 16)}
Gruß, mawe
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

Code: Alles auswählen

listOrigin = [['id', 'desc', 'data'], [1, 'OS07', 'aaa'], [2, 'AT223', 'bbb'], [3, 'URN7','ccc'], [16, 'MU33','ddd']] 

#Zieldictionary 
targetDict = {'desc': ['LH007', 'SQ223', 'MSN7', 'MSN33'], 'id': [1, 2, 3, 16], 'data':['aaa','bbb','ccc','ddd']} 
wird zu:

Code: Alles auswählen

listOrigin = [['id', 'desc', 'data'], [1, 'OS07', 'aaa'], [2, 'AT223', 'bbb'], [3, 'URN7','ccc'], [16, 'MU33','ddd']]

keys = listOrigin[0]
targetDict = {}
for k in keys:
    pos = listOrigin[0].index(k)
    targetDict[k] = [ n[pos] for n in listOrigin[1:] ]

print targetDict
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

hi!

danke für eure antworten!

ich habe noch eine weiterführende Frage, die wahrscheinlich eher ins ZOPE/Plone Forum passt, aber der Vollständigkeit halber bleibe ich hier.

Ich möchte das targetDict in Zope/Plone in einem Page Template zu einer Tabelle machen.

1) Ist die Form des targetDict dazu gut geeignet?

Code: Alles auswählen

targetDict = {'desc': ['LH007', 'SQ223', 'MSN7', 'MSN33'], 'id': [1, 2, 3, 16], 'data':['aaa','bbb','ccc','ddd']}
2) Die Tabelle aus meinem erstellten Page Tamplate wird falsch dargestellt. Wie kann ich die tal:repeat Anweisungen anpassen, damit meine Tabelle richtig dargestellt wird?

Code: Alles auswählen

   <table>
     <tr>
	  <th tal:repeat="head request/targetDict/keys" tal:content="python:head"></th>
	</tr>
        <tr tal:repeat="values_lines request/targetDict/values"> 
	     <td tal:content="python:values_lines[0]"></td>
          <td tal:content="python:values_lines[1]"></td>
          <td tal:content="python:values_lines[2]"></td> 
       </tr>
   </table>

Danke für eure Hinweise,

Johannes
Antworten