È possibile utilizzare set
intersezioni:
if not d.viewkeys() & {'amount', 'name'}:
raise ValueError
In Python 3, che sarebbe:
if not d.keys() & {'amount', 'name'}:
raise ValueError
perché .keys()
restituisce una vista dict di de colpa. Dictionary view objects come restituito da .viewkeys()
(e .keys()
in Python 3) agire come insiemi e test intersezione è molto efficiente.
Demo in Python 2.7:
>>> d = {
... 'name': 'name',
... 'date': 'date',
... 'amount': 'amount',
... }
>>> not d.viewkeys() & {'amount', 'name'}
False
>>> del d['name']
>>> not d.viewkeys() & {'amount', 'name'}
False
>>> del d['amount']
>>> not d.viewkeys() & {'amount', 'name'}
True
Si noti che questo test vero solo se entrambi i tasti sono mancanti. Se avete bisogno della vostra prova da superare se sia manca, uso:
if not d.viewkeys() >= {'amount', 'name'}:
raise ValueError
che è falso solo se entrambi i tasti sono presenti:
>>> d = {
... 'name': 'name',
... 'date': 'date',
... 'amount': 'amount',
... }
>>> not d.viewkeys() >= {'amount', 'name'}
False
>>> del d['amount']
>>> not d.viewkeys() >= {'amount', 'name'})
True
Per un rigoroso confronto (permettendo solo le due chiavi, né più né meno), in Python 2, confronta la visualizzazione del dizionario con un set:
if d.viewkeys() != {'amount', 'name'}:
raise ValueError
(Così in Python 3 che sarebbe if d.keys() != {'amount', 'name'}
).
Sono confuso un po ', come posso testare se '{ 'quantita', 'nome'}' entrambi sono presenti in 'd'? – daydreamer
@daydreamer: 'd.viewkeys()> = { 'quantita', 'nome'}' è 'true' se entrambi i tasti sono presenti. –
Avevo bisogno di un confronto rigoroso, quindi credo '>>> d.viewkeys() == {'name', 'amount', 'date'} True' è abbastanza buono, cosa ne pensi? – daydreamer