2013-04-14 7 views

risposta

28

È 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'}).

+0

Sono confuso un po ', come posso testare se '{ 'quantita', 'nome'}' entrambi sono presenti in 'd'? – daydreamer

+0

@daydreamer: 'd.viewkeys()> = { 'quantita', 'nome'}' è 'true' se entrambi i tasti sono presenti. –

+0

Avevo bisogno di un confronto rigoroso, quindi credo '>>> d.viewkeys() == {'name', 'amount', 'date'} True' è abbastanza buono, cosa ne pensi? – daydreamer

9
if all(k not in d for k in ('name', 'amount')): 
    raise ValueError 

o

if all(k in d for k in ('name', 'amount')): 
    # do stuff 
+0

più facile da leggere e attraversare compatibile con tutte le versioni di pitone . +1. – darksky

3

È inoltre potrebbe usare impostato come:

>>> d = { 
    'name': 'name', 
    'date': 'date', 
    'amount': 'amount', 
} 
>>> test = set(['name','date']) 
>>> test.issubset(set(d.keys())) 
True 
+1

Se si utilizza un metodo 'set', non è necessario convertire l'argomento in' set'. quindi 'test.issubset (d.keys())' funzionerà correttamente. Potete semplificarlo ulteriormente e fare 'test.issubset (d)' In alternativa 'test' <=' d.viewkeys() '(o' d.keys() 'su Py3k). Vorrei +1 se non avessi esaurito i voti – jamylak

+0

Sì, hai ragione. Grazie per i vostri suggerimenti! – Sheng

0

mi piace questa forma:

>>> d = { 
... 'name': 'name', 
... 'date': 'date', 
... 'amount': 'amount' 
... } 
>>> tests={'name','date'} 
>>> if any(test not in d for test in tests): 
... raise ValueError 
>>> # no error... 

>>> del d['name'] 
>>> if any(test not in d for test in tests): 
... raise ValueError 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
ValueError 

Funziona su Py 2 o Py 3

Problemi correlati