Se non si ha già familiarità con REPL di Python (Read-Valutare-Stampa-Loop - quella cosa in cui si digita il codice, premere Invio e valuta immediatamente) , sarebbe un buon strumento qui.
Così iniziamo ad analizzare il codice.
crucial = {'eggs': '','ham': '','cheese': ''}
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
Abbastanza semplice. Anche se noto che non hai alcun valore nel dizionario crucials
. Non sono sicuro che questa sia un'abbreviazione per il tuo esempio o se ti interessi semplicemente le chiavi. Se ti preoccupi solo delle chiavi, suppongo che tu stia usando un dizionario per garantire l'unicità. In tal caso, dovresti controllare lo set
data structure.
Esempio:
crutial = set(['cheese', 'eggs', 'ham'])
Proseguendo abbiamo
if crucial.keys() in dishes.keys():
qui si utilizza il in
comparison operator. Esempio:
5 in [5, 4] #True
3 in [5, 4] #False
Se valutiamo crucial.keys()
e dishes.keys()
otteniamo
>>> crucial.keys()
['cheese', 'eggs', 'ham']
>>> dishes.keys()
['eggs', 'bacon', 'sausage', 'spam']
così durante l'esecuzione il codice valuta come
['cheese', 'eggs', 'ham'] in ['eggs', 'bacon', 'sausage', 'spam']
che restituisce False
perché il valore ['eggs', 'bacon', 'sausage']
(che è una lista) non è nella lista ['eggs', 'bacon', 'sausage', 'spam']
(in effetti non ci sono liste all'interno di quella lista, solo stringhe).
Così si sta valutando come
if False:
print dishes[value] #note value is not defined.
E invece sembra aver mescolato/confondere l'operatore in
che restituisce un valore booleano e la per iteratore (for item in collection
). C'è una sintassi per questo genere di cose. Si chiama list comprehensions che puoi trovare esempi di risposte in @ShawnZhang e @ kmad. Puoi pensare ad esso come un modo teso per filtrare e modificare (mappare) una collezione, restituendo di conseguenza un elenco. Non voglio entrare troppo in profondità o finirò con un'introduzione alla programmazione funzionale.
L'altra opzione è utilizzare l'iterazione for .. in
e gli operatori in
separatamente. Questa è la soluzione che ha dato @timc. Tali soluzioni sono probabilmente più familiari o più facili per i principianti. Separa chiaramente il comportamento di iterazione e filtraggio. È anche più simile a quello che verrebbe scritto in altri linguaggi di programmazione che non hanno un equivalente di list comprehensions. Chi lavora molto in Python probabilmente preferirebbe la sintassi di comprensione.
Quale versione di Python stai usando? – Blckknght