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
Listenwerte aus dictionary auslesen
Code: Alles auswählen
>>> a = { 'b' : [1,2,3,4,5] }
>>> print a.values()
[[1, 2, 3, 4, 5]]
>>> print a['b'][2]
3
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'
the more they change the more they stay the same
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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
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?
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
wieder so eine stolperstelle...
für hinweise wirklich dankbar

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
für hinweise wirklich dankbar
der späte wurm ...
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
wenn ich den Stacktrace richtig deute:
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.
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
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.
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
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
der späte wurm ...
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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...

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...
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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:
Oder irre ich mich?
Ü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, ...],
...
}
}
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Wenn man Datenstrukturen so tief schachtelt, sollte man ernsthaft ueber Klassen/eigene Typen nachdenken.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@ 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..
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...
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]
}

@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...

der späte wurm ...
Dann ist der Code aber anders eingerückt wie oben gepostet...ali2go hat geschrieben:@hyperion
wegen der year ausgabe vor zeile 17, als werte werden 1961 und 1962 ausgegeben...
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``...
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Würde ich auch mal so sagenice2k3 hat geschrieben:Dann ist der Code aber anders eingerückt wie oben gepostet...ali2go hat geschrieben:@hyperion
wegen der year ausgabe vor zeile 17, als werte werden 1961 und 1962 ausgegeben...

Oder er hat in Zeile 11 ``print year`` geschrieben und interpretiert das als "vor Zeile 17"Hyperion hat geschrieben:Würde ich auch mal so sagenice2k3 hat geschrieben:Dann ist der Code aber anders eingerückt wie oben gepostet...ali2go hat geschrieben:@hyperion
wegen der year ausgabe vor zeile 17, als werte werden 1961 und 1962 ausgegeben...

- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Auf jeden Fall sind wir uns ja einig, dass bei obigen Code nicht das passiert, was der OP erwartetice2k3 hat geschrieben: Oder er hat in Zeile 11 ``print year`` geschrieben und interpretiert das als "vor Zeile 17"

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
ausgabe nur das jahr 1962 ... und der list index out of error fehler
gruss
a
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])
gruss
a
der späte wurm ...
@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.
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.