List, Array oder Dictionary

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
NinaKlein
User
Beiträge: 4
Registriert: Donnerstag 21. Februar 2013, 12:43

Hi,

ich bin neu hier im Forum und moechte mich deswegen kurz vorstellen. Ich heisse Nina bin 24Jahre alt, komme aus Berlin und studiere zur Zeit. Ich sitz seit ein paar Wochen an mehreren kleinen Python Skripten und es macht mir echt Spass damit zu programmieren (ist meine erste Programmiersprache). Im Moment sitz ich allerdings an einem fuer euch bestimmt trivialen Problem und wollte fragen ob ihr mir dau Tipps und Denkanstoesse geben koenntet.

Ich bekomme ueber eine SQL Abfrage einige Arrays nach folendem Schema:

z1 = ((2001,12), (2002,4), (2003,21), (2004,3))
z2 = ((2001,3), (2002,44), (2005,2), (2006,34))
z3 = ((2002,1), (2003,14), (2004,221), (2005,443))

Und wuerde dies nun gerne in eine Tabelle schreiben mit folgendem Output:

Jahr | z1 | z2 | z2
+++++++++++++++
2001| 12 3 0
2002| 4 44 1
2003| 21 0 14
2004| 3 0 221
2005| 0 2 443
2006| 0 34 0

Dabei sollen die nicht vorhanden Stellen mit 0 geschrieben werden..

Koennt ihr mir da Tipps geben? Also wie ich es allg in eine csv schreibe ist kein Problem aber wie bekomm ich es so gereglt, dass alles zusammen passt?

Waere ueber Hilfe sehr dankbar :)

eure LisaKlein :wink:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Das lässt sich in wenigen Zeilen lösen:

Code: Alles auswählen

>>> zs = [((2001,12), (2002,4), (2003,21), (2004,3)), ((2001,3), (2002,44), (2005,2), (2006,34)), ((2002,1), (2003,14), (2004,221), (2005,443))]
>>> import collections
>>> d = collections.defaultdict(lambda : [0, 0, 0])
>>> for i, xs in enumerate(zs):
...     for (year, value) in xs:
...         d[year][i] = value
... 
>>> d
defaultdict(<function <lambda> at 0x17a47d0>, {2001: [12, 3, 0], 2002: [4, 44, 1], 2003: [21, 0, 14], 2004: [3, 0, 221], 2005: [0, 2, 443], 2006: [0, 34, 0]})
Du musst ggf. noch auf die Sortierung achten.
Das Leben ist wie ein Tennisball.
NinaKlein
User
Beiträge: 4
Registriert: Donnerstag 21. Februar 2013, 12:43

Teste ich gelich und les mich mal ein, das is noch relativ neu fuer mich :)

danke dafuer =)
NinaKlein
User
Beiträge: 4
Registriert: Donnerstag 21. Februar 2013, 12:43

Leider habe ich noch ein Problem:

Das Beispiel funktioniert ja jetzt wuerde 3 Werte (0,0,0) aber die Anzahl soll da variabel sein da es manchmal 4 Arrays sind manchmal aber auch ueber 100..!?
Kann ich dem dann irgend wie die len(Array) uebergeben?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

lambda : [0]*len(zs)
Das ist aber eigentlich eine absolute Grundlage. Hast du das Tutorial durchgearbeitet?
Das Leben ist wie ein Tennisball.
NinaKlein
User
Beiträge: 4
Registriert: Donnerstag 21. Februar 2013, 12:43

Ja bin hier durch: http://docs.python.org/2/library/collections.html

Habe das auch versucht aber hatte einen Dreher zs heisst bei mir ts und s zs deswegen bin ich durcheinander gekommen..

sorry und nochmals vielen Dank :)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

NinaKlein hat geschrieben:Habe das auch versucht aber hatte einen Dreher zs heisst bei mir ts und s zs deswegen bin ich durcheinander gekommen.
Und wieder ein Argument für deskriptive Bezeichnernamen. :D
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

/me hat geschrieben:
NinaKlein hat geschrieben:Habe das auch versucht aber hatte einen Dreher zs heisst bei mir ts und s zs deswegen bin ich durcheinander gekommen.
Und wieder ein Argument für deskriptive Bezeichnernamen. :D
Ach was, bei xs, zs und ts ist doch klar was drinnen steckt. Eben Listen bestehend aus x-Elementen, y-Elementen und t-Elementen. :lol:
Das Leben ist wie ein Tennisball.
Antworten