Seite 1 von 1
Listenwerte aus dictionary auslesen
Verfasst: Montag 16. November 2009, 16:22
von ali2go
Hallo
Ich habe eine Frage bezüglich der Abfrage von Listen Werten die in einem Dictionary abgespeichert sind.
also zb dict={1961:[1,2,3,4,5,6,7,8,9,10,11,12]}
wie kann ich jetzt auf die einzelnen werte in der liste zugreifen
wenn ich zb. dict.values([0])
eingebe gibt er diesen fehler aus
print(dict.values([0]))
TypeError: values() takes no arguments (1 given)
was läuft falsch?
in den ganzen dictionary docs finde ich keine antwort oder übersehe Sie..
besten Dank
a
Verfasst: Montag 16. November 2009, 16:27
von Dav1d
Code: Alles auswählen
>>> a = { 'b' : [1,2,3,4,5] }
>>> print a.values()
[[1, 2, 3, 4, 5]]
>>> print a['b'][2]
3
-values() gibt eine Liste mit allen "Values" eines Dictionaries zurück um explezit auf eine Liste zuzugreifen musste diese Liste auswählen
z.B. a['b'] wäre jetzt die gewünschte Liste um jetzt auf ein Element der Liste zuzugreifen zu können musst du a['b'] als normale Liste hand haben => a['b'][0] = Erstes Element aus der Liste im Dictionary a mit dem Key 'b'
Verfasst: Montag 16. November 2009, 16:28
von Hyperion
Ich würde sagen, schau noch mal ins Tutorial:
http://docs.python.org/tutorial/datastr ... ctionaries
http://docs.python.org/tutorial/introduction.html#lists
Leg Dir in einer Python-Shell ein Test-Dictionary an und spiele damit herum. Leg Dir eine Test-Liste an und spiele damit herum. Dann packe die Liste als value in Dein Dictionary und versuche auf diese zuzugreifen wie auf jede andere beliebige value
Code: Alles auswählen
In [1]: d = {"foo": 3, "bar": "anderer typ", "test": [1,2,5,42]}
In [2]: d["foo"]
Out[2]: 3
In [3]: d["bar"]
Out[3]: 'anderer typ'
In [4]: d["test"]
# Na, was wird hier rauskommen?
Verfasst: Montag 16. November 2009, 16:48
von ali2go
ok super so gehts natürlich
warscheinlich zu simpel um selber drauf zu kommen
vielen dank jetzt läufts
key value zufügen/ verschwindet..
Verfasst: Montag 16. November 2009, 17:10
von ali2go
also nachdem in meinem code jetzt im dict alle werte der liste ansprechbar sind bleibt mir noch ein weiteres problem
es handelt sich um eine for schleife die über verschiedene jahre laufen soll und in diesen jahren für temperatur werte monatliche mittelwerte errechnen soll
das ganze sieht bis jetzt so aus
Code: Alles auswählen
year2month=defaultdict(list)
month2temperatures = defaultdict(list)
with open("twoyears.csv", 'r') as temperature_file:
for row in csv.reader(temperature_file, delimiter=';'):
year,month, temperature = int(row[1]),int(row[2]), float(row[4])
month2temperatures[month].append(temperature)
#year2month[year].append (month2temperatures)
for month, temperatures in sorted(month2temperatures.items()):
d = sum(temperatures) / len(temperatures)
#print ('%2d: %f' % (month, sum(temperatures) / len(temperatures)))
year2month[year].append(d)
print(year2month)
print(year2month[1961][0])
#was jetzt aber passiert ist das ich nur die werte des letzten jahres in der ausgabe bekomme
defaultdict(<class 'list'>, {1962: [-3.1677419354838707, -0.3875000000000001, 1.7838709677419355, 7.313333333333335, 8.66290322580645, 12.67666666666667, 13.21935483870968, 14.449999999999998, 10.603333333333333, 6.898387096774194, 2.1566666666666667, -4.948387096774193]})
Traceback (most recent call last):
File "E:\Programme\eclipse\workspace\learning\src\forum.py", line 26, in <module>
print(year2month[1961][0])
IndexError: list index out of range
wieder so eine stolperstelle...
für hinweise wirklich dankbar
Verfasst: Montag 16. November 2009, 17:17
von Hyperion
wenn ich den Stacktrace richtig deute:
Code: Alles auswählen
In [5]: d = {1962: [0, 1, 2], 1961: []}
In [6]: d[1961]
Out[6]: []
In [7]: d[1961][0]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
/home/nelson/<ipython console> in <module>()
IndexError: list index out of range
Nebenbei: Verwendest Du Python 3.x?
Dein Code sieht um ehrlich zu sein recht schlampig und wenig strukturiert aus! (Wieso postest Du auskommentiere Zeilen hier im Forum?). Ich würde das Einlesen und Berechnen jeweils in eine separate Funktion packen und sämtlichen anderen Code auch aus der Modulebene entfernen.
Verfasst: Montag 16. November 2009, 17:26
von ali2go
ja ich verwende python 3.1
habe ein Buch gekauft indem die version empfohlen wurde
was meinst Du zu dieser wahl?
Habe schon festgestellt dass es da einige unterschiede gibt
zu 2.6
der Code ist ein scetch an dem ich arbeite das soll dann als funktion in ein grösseres programm einfliessen, sauberen programmierstil würde ich das auch nicht nennen
was sagt mir dein stacktrace?
wenn iches richtig deute hast du ja in deinem bsp. dem jahr 1962 eine gefüllte liste zugewiesen und 1961 eine leere..
in meinem programm werden ja werte für 1961 berechnet und angehangen, nur scheint py diese zu überschreiben bei den berechnungen wenn ein neuer wert fürs jahr auftaucht?
korrekt?
a
Verfasst: Montag 16. November 2009, 17:41
von Hyperion
Nein, Python 3.1 ist schon ok, nur muss man so was natürlich wissen
Mein Stacktrace sagt Dir, dass genau dieser Fehler kommt, wenn man auf einen Index mit einer leeren Liste zugreifen will. Also ist bei Dir genau das der Fall. Man sieht ja auch, dass "1961" bei Dir eben nicht vorkommt in der Liste...
Verfasst: Montag 16. November 2009, 17:48
von ali2go
Ja das das der fehlergrund ist war mir auch klar
aber warum er auftritt ...das bleibt die grosse Frage

Verfasst: Montag 16. November 2009, 18:03
von Hyperion
Deine Schleifen-Konstrukte sind eben so falsch! Lass Dir doch mal "year" vor der Zeile 17 ausgeben...
Überhaupt kapiere ich Deine Datenstruktur so auch nicht! Wieso hast Du zwei Dictionaries? Du willst doch eher so eine Struktur:
Code: Alles auswählen
d = {
1961: {
1: [wert1, wert2, ...],
2: [wert1, wert2, ...],
12: [wert1, wert2, ...]
},
1962: {
1: [wert1, wert2, ...],
...
}
}
Oder irre ich mich?
Verfasst: Montag 16. November 2009, 19:00
von cofi
Wenn man Datenstrukturen so tief schachtelt, sollte man ernsthaft ueber Klassen/eigene Typen nachdenken.
Verfasst: Dienstag 17. November 2009, 12:46
von ali2go
@ hyperion
im prinzip hast du das richtig erkannt.mit kleinen änderungen ich will als endprodukt ein dictionary wo als key die jahre stehen und angehangen eine liste mit 12 mittelwerten. Diese werte brauch ich dann zum weiterrechnen in einer anderen berechnung..
Code: Alles auswählen
d ={
1961:[wert1,wert2,wert3,...wert12],
1962:[wert1,wert2,wert3...wert12]
}
nur wie ich das mit meiner code konstruktion hinbekomme..?

@cofi
Klassen und objekte sind bestimmt sehr spannend nur erschliessen sie sich dem anfänger nicht sofort, learning by doing, ja gerne
aber es muss ja nicht alles aufeinmal sein...

Verfasst: Dienstag 17. November 2009, 12:54
von ali2go
@hyperion
wegen der year ausgabe vor zeile 17, als werte werden 1961 und 1962 ausgegeben...
Verfasst: Dienstag 17. November 2009, 13:02
von ms4py
ali2go hat geschrieben:@hyperion
wegen der year ausgabe vor zeile 17, als werte werden 1961 und 1962 ausgegeben...
Dann ist der Code aber anders eingerückt wie oben gepostet...
Poste mal nochmal deinen Code *unverändert*, am besten in einem Pastebin (
http://paste.pocoo.org )
Edit: Oder meinst du mit "vor Zeile 17" den Block bei Zeile 11? Wenn ja, dann schreib mal *eine* Zeile vor 17 ``print year``...
Verfasst: Dienstag 17. November 2009, 13:08
von Hyperion
ice2k3 hat geschrieben:ali2go hat geschrieben:@hyperion
wegen der year ausgabe vor zeile 17, als werte werden 1961 und 1962 ausgegeben...
Dann ist der Code aber anders eingerückt wie oben gepostet...
Würde ich auch mal so sagen

Verfasst: Dienstag 17. November 2009, 13:17
von ms4py
Hyperion hat geschrieben:ice2k3 hat geschrieben:ali2go hat geschrieben:@hyperion
wegen der year ausgabe vor zeile 17, als werte werden 1961 und 1962 ausgegeben...
Dann ist der Code aber anders eingerückt wie oben gepostet...
Würde ich auch mal so sagen

Oder er hat in Zeile 11 ``print year`` geschrieben und interpretiert das als "vor Zeile 17"

Verfasst: Dienstag 17. November 2009, 13:20
von Hyperion
ice2k3 hat geschrieben:
Oder er hat in Zeile 11 ``print year`` geschrieben und interpretiert das als "vor Zeile 17"

Auf jeden Fall sind wir uns ja einig, dass bei obigen Code nicht das passiert, was der OP erwartet

Verfasst: Donnerstag 19. November 2009, 19:05
von ali2go
Hallo,
sorry wegen der kommunikationspause
ich musste ein paar andere dinge weiterbearbeiten , zum glück einiges auch in python..
ich habe den code nochmal angeschaut und tatsächlich wars nicht der original code in dem ich die zeile 17 print ausgabe eingegeben hatte
also mir ist auch klar das es sich um ein schleifen problem handelt allerdings wobei es hakt weiss ich auch nicht
ich poste den "original" code mal hier und bastel weiter falls sich jemand berufen fühlt ist ihm mein dank sicher
Code: Alles auswählen
from __future__ import with_statement
import csv
from collections import defaultdict
year2month=defaultdict(list)
month2temperatures = defaultdict(list)
with open("twoyears.csv", 'r') as temperature_file:
for row in csv.reader(temperature_file, delimiter=';'):
year,month, temperature = int(row[1]),int(row[2]), float(row[4])
month2temperatures[month].append(temperature)
print(year)
for month, temperatures in sorted(month2temperatures.items()):
d = sum(temperatures) / len(temperatures)
year2month[year].append(d)
print(year2month)
print(year2month[1961][0])
ausgabe nur das jahr 1962 ... und der list index out of error fehler
gruss
a
Verfasst: Donnerstag 19. November 2009, 20:21
von BlackJack
@ali2go: Du solltest nicht "basteln" sondern Dir klarmachen, warum das so ist. In Zeile 23 hat `year` welchen Wert!? Und warum!? Du scheinst etwas anderes zu erwarten. Warum das?
Geh das Programm mal selber auf einem Blatt Papier Schritt für Schritt durch. Was Du da wirklich in welcher Datenstruktur speicherst.
Oder umgekehrt: Erstelle mit Papier und Bleistift Deine gewünschte Lösung und versuche die einzelnen Schritte dabei genau zu erfassen. *Das* ist es nämlich, was Du dann in ein Programm giessen musst.