Iteration through nested dict

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
jakob83
User
Beiträge: 6
Registriert: Sonntag 14. Juni 2020, 12:41

Hallo zusammen,

ich möchte Werte aus einem nested dict aufzählen und später in eine mysql DB schreiben.

Daten:

data.py:

Code: Alles auswählen

pmetals = ("Ag", "Au", "Pd")

currencies = ("usd", "eur")

units = ("oz", "g", "kg", "lbs")

cur_pm_prices = {
    "Au": {
        "usd": {
            "oz": 1854.23,
            "g": 1.0,     # fix
            "kg": 2.0,    # fix
            "lbs": 4.0    # fix
        },
        "eur": {
            "oz": 5.0,    # fix
            "g": 6.0,     # fix
            "kg": 7.0,    # fix
            "lbs": 8.0    # fix
        }
    },
    "Ag": {
        "usd": {
            "oz": 22.54,
            "g": 9.0,   # fix
            "kg": 10.0,  # fix
            "lbs": 11.0  # fix
        },
        "eur": {
            "oz": 12.0,  # fix
            "g": 13.0,   # fix
            "kg": 14.0,  # fix
            "lbs": 15.0  # fix
        }
    },
    "Pd": {
        "usd": {
            "oz": 1980.0,
            "g": 16.0,   # fix
            "kg": 17.0,  # fix
            "lbs": 18.0  # fix
        },
        "eur": {
             "oz": 19.0,   # fix
             "g": 20.0,    # fix
             "kg": 21.0,    # fix
             "lbs": 22.0    # fix
        }
    }
}

import_data.py:

Code: Alles auswählen



def get_pm_price(pm, cur, unit):
    pm_price = ((data.cur_pm_prices.get(pm)).get(cur)).get(unit)
    for unit in data.units:
        pm_price = ((data.cur_pm_prices.get(pm)).get(cur)).get(unit)
    print(pm_price)
    return

def get_pmetal_prices():
    for pm in data.pmetals:
        for cur in data.currencies:
            for unit in data.units:
                get_pm_price(pm, cur, unit)
    return

get_pmetal_prices()

Ich bekomme leider:

11.0
11.0
11.0
11.0
15.0
15.0
15.0
15.0
4.0
4.0
4.0
4.0
8.0
8.0
8.0
8.0
18.0
18.0
18.0
18.0
22.0
22.0
22.0
22.0


....


Wie kann ich es schaffen, alle möglichen Kombinationen innerhalb der Funktion zu bekommen, damit ich diese Werte in die MySQL DB schreiben kann?
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Was soll die for-Schleife in `get_pm_price`?
Benutze statt `get` eckige Klammern, dann bekommst Du wenigstens ordentliche KeyError-Exceptions, wenn ein Eintrag nicht existiert, statt nichtssagender AttributeErrors.
Benutze aussagekräftige Variablennamen, statt nichtssagender oder missverständlicher Abkürzungen.
Bei einer Funktion die `get...` heißt, erwartet der Nutzer, dass er was bekommt, nicht dass da was ausgegeben wird.

Code: Alles auswählen

def get_precious_metal_price(precious_metal, currency, unit):
    return data.precious_metal_prices[precious_metal][currency][unit]

def output_all_precious_metal_prices():
    for precious_metal in data.precious_metals:
        for currency in data.currencies:
            for unit in data.units:
                print(get_precious_metal_price(precious_metal, currency, unit))

output_all_precious_metal_prices()
jakob83
User
Beiträge: 6
Registriert: Sonntag 14. Juni 2020, 12:41

Du hattest absout recht... die for-Schleife hat es verhindert... jetzt funktioniert es!

Könntest du mir noch anhand eines Beispieles zeigen wie man die eckigen Klammern nutzen kann?

Danke für Deine schnelle Hilfe!
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Beispiel ist doch schon da.
jakob83
User
Beiträge: 6
Registriert: Sonntag 14. Juni 2020, 12:41

Oh Mann, sorry war ein hektischer Tag heute.
Vielen Dank nochmals!!
jakob83
User
Beiträge: 6
Registriert: Sonntag 14. Juni 2020, 12:41

Danke auch nochmal für den Wink bezüglich der nichtssagenden Abkürzungen.
Ich werde den gesamten code diesbezüglich überarbeiten.
Es ist wirklich viel sinnvoller!
Antworten