Seite 1 von 1

Iteration through nested dict

Verfasst: Montag 6. Juni 2022, 20:51
von jakob83
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?

Re: Iteration through nested dict

Verfasst: Montag 6. Juni 2022, 21:33
von Sirius3
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()

Re: Iteration through nested dict

Verfasst: Dienstag 7. Juni 2022, 09:19
von jakob83
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!

Re: Iteration through nested dict

Verfasst: Dienstag 7. Juni 2022, 09:31
von Sirius3
Das Beispiel ist doch schon da.

Re: Iteration through nested dict

Verfasst: Dienstag 7. Juni 2022, 18:29
von jakob83
Oh Mann, sorry war ein hektischer Tag heute.
Vielen Dank nochmals!!

Re: Iteration through nested dict

Verfasst: Dienstag 7. Juni 2022, 20:33
von jakob83
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!