Listenwerte aus dictionary auslesen

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
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

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
der späte wurm ...
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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'
the more they change the more they stay the same
Benutzeravatar
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 ;-)

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?
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

ok super so gehts natürlich
warscheinlich zu simpel um selber drauf zu kommen
:oops:

vielen dank jetzt läufts
der späte wurm ...
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

also nachdem in meinem code jetzt im dict alle werte der liste ansprechbar sind bleibt mir noch ein weiteres problem
:shock:
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
der späte wurm ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

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 :oops:

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 ...
Benutzeravatar
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...
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

Ja das das der fehlergrund ist war mir auch klar
aber warum er auftritt ...das bleibt die grosse Frage :?:

:wink:
der späte wurm ...
Benutzeravatar
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:

Code: Alles auswählen

d = {
    1961: {
         1: [wert1, wert2, ...],
         2: [wert1, wert2, ...],
         12:  [wert1, wert2, ...]
    },
    1962: {
         1: [wert1, wert2, ...],
         ...
    }
}
Oder irre ich mich?
Benutzeravatar
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.
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

@ 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... :wink:
der späte wurm ...
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

@hyperion
wegen der year ausgabe vor zeile 17, als werte werden 1961 und 1962 ausgegeben...
der späte wurm ...
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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``...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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" ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

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 :oops:
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
der späte wurm ...
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.
Antworten