Domanda Risolto Problema con ciclo for per dictionary annidato

Stato
Discussione chiusa ad ulteriori risposte.

Johnsum

Utente Electrum
22 Gennaio 2017
218
56
7
146
Ciao
Ho iniziato da poco a studiare Python da zero.
Sto avendo delle difficoltà con i dictionary, in particolare con l'estrazione dei valori da dizionari annidati.

Questo è il dizionario:

Codice:
shopping = {
'beer': {'quantity': 6, 'price': 1.60},
'potatos': {'quantity': 3, 'price': 1},
'milK': {'quantity': 2, 'price': 1.20}
}


in poche parole per ogni chiave di shopping (beer, potatos e milk) devo moltiplicare le quantità per il prezzo
e poi aggiungere i 3 subtotali al totale complessivo. Volveo stampare anche i subtotali prima.

Ho inziato a fare così:

Codice:
tot = 0
for elem, value in shopping.items():
   print(f"Total amount {elem}:")
   for pre, qua in value.items():
   print(qua)

Anche se ho risolto problematiche simili in prcedenza adesso sto avendo problemi in questo caso specifico e mi sono incartato
Ho aggiunto print(qua) per verificare l'estrazione dei valori, però non ho capito come fare il calcolo. Ci ho provato ma ottengo sempre problemi in merito a valori integer.
più che a risolvere questo problema, potete aiutarmi a capire la procedura?
Grazie
 
Python:
shopping = {
'beer': {'quantity': 6, 'price': 1.60},
'potatos': {'quantity': 3, 'price': 1},
'milK': {'quantity': 2, 'price': 1.20}
}
tot = 0
for k, v in shopping.items():
    qnt, prc = v['quantity'], v['price']
    sub_tot = qnt * prc
    tot += sub_tot
    print(f"{k}: {sub_tot:.2f}")
print(f"Totale: {tot:.2f}")

Questo dovrebbe essere il codice che cerchi.
Il doppio for e' inutile e non capisco a cosa ti serva..
Con il primo for iteri sulle chiavi e per ogni chiave hai anche il valore corrpondente.
 
  • Mi piace
Reazioni: Kode
Python:
shopping = {
'beer': {'quantity': 6, 'price': 1.60},
'potatos': {'quantity': 3, 'price': 1},
'milK': {'quantity': 2, 'price': 1.20}
}
tot = 0
for k, v in shopping.items():
    qnt, prc = v['quantity'], v['price']
    sub_tot = qnt * prc
    tot += sub_tot
    print(f"{k}: {sub_tot:.2f}")
print(f"Totale: {tot:.2f}")

Questo dovrebbe essere il codice che cerchi.
Il doppio for e' inutile e non capisco a cosa ti serva..
Con il primo for iteri sulle chiavi e per ogni chiave hai anche il valore corrpondente.

Si è questo. Grazie
Però voglio capire bene il funzionamento.

in k ci vanno le prime chiavi (beer, potatos, milk). OK
Non mi è tanto chiaro il funzionamento di v.
Scusami, ma sono praticamente agli inizi. Faccio pure ancora confusione nell'estrazione di dati di dictionary e liste.

Grazie
 
Per capire quello che stai facendo il primo passo e' capire su cosa stai iterando.
Usando un print(shopping.items()) otterai questo:

Python:
dict_items([('beer', {'quantity': 6, 'price': 1.6}), ('potatos', {'quantity': 3, 'price': 1}), ('milK', {'quantity': 2, 'price': 1.2})])

che non e' altro che un array di tuple.

usando

Python:
for k, v in shopping.items():

Sto facendo due cose contemporaneamente ovvero:
1- Itero su ogni tupla con il for
2- Eseguo l'unpack della tupla ( che ha due elementi) su k e v

Ora le cose da capire sono le suguenti:
Q:Quante sono le tuple?
A: sono tante quante il numero delle chiavi

Q:k e v cosa sono?
A: k assume il valore contenuto in posizione 0 della tupla --> in questo caso la chiave
v assume il valore contenuto in posizione 1 della tupla --> in questo caso un altro dict
 
Stato
Discussione chiusa ad ulteriori risposte.