Seite 1 von 1

2D Liste dynamisch in Dictionary umwandeln

Verfasst: Freitag 12. Januar 2007, 15:45
von keboo
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

Verfasst: Freitag 12. Januar 2007, 15:59
von mawe
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

Ich würde es so machen

Verfasst: Freitag 12. Januar 2007, 22:36
von sunmountain

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

weiterführende frage

Verfasst: Dienstag 16. Januar 2007, 13:43
von keboo
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