2013-08-07 6 views
0

j'ai un dictionnaire où les valeurs sont un tupleévaluer les valeurs d'un dictionnaire

dict={'A':('1','2','3'),'B':('2','3','xxxx')....} 

J'ai besoin de savoir si toutes les valeurs ont un « » ou aucun dans leur troisième élément.
Il doit juste être une évaluation booléenne.
Quel est le moyen le plus concis pour y arriver?

C'est ce que je l'ai fait:

all(not v[2] for v in dict.values()) 

Mais je suppose qu'il y aura une meilleure forme « tout » à ce sujet?

+0

Une tentative de votre part pourrait-elle être affichée? – Amndeep7

+0

Que voulez-vous dire par "'n'importe quelle forme"? Demandez-vous s'il existe un moyen d'écrire ceci avec 'any()' à la place? Ce serait 'any (v [2] n'est pas None et v [2]! = '' Pour v dans dict.values ​​())'. En passant, si vous vérifiez '' '' ou 'None', vous ne devriez pas vous fier à la véracité de ces deux éléments, puisque vous pourriez également évaluer par erreur la véracité d'un entier ou d'une liste. – 2rs2ts

Répondre

4

Vous pouvez utiliser (Utiliser itervalues ​​() pour Py2x)

all(elem[2] in ('', None) for elem in test.values()) 

Voir la démo -

>>> test = {'a': (1, 2, None), 'b':(2, 3, '')} 
>>> all(elem[2] in ('', None) for elem in test.values()) 
True 
>>> test['c'] = (1, 2, 3) 
>>> all(elem[2] in ('', None) for elem in test.values()) 
False 
+1

L'appel 'values ​​()' va créer une liste de valeurs de dictionnaire, qui peuvent être grandes. 'itervalues ​​()' serait un meilleur choix, comme dans la solution de @ JAB. – nofinator

+1

@nofinator: Toutes mes excuses. J'ai testé ce code sur Py3x et complètement oublié d'ajouter itervalues. Merci de me le rappeler. :) –

4

Python 2:

boolean = all(value[2] in ('', None) for value in your_dict.itervalues()) 

Python 3:

boolean = all(value[2] in ('', None) for value in your_dict.values()) 
1

Que diriez-vous ceci:

all(dict[k][2] is None or dict[k][2] == "" for k in dict) 
0
reduce(lambda x,y: x and y[2] not in ('', None), d.values(), True) 
0

Voici une solution simple et fonctionnelle:

not filter(lambda l : not l, [ v[2] for v in d.values()]) 

Il retournera False si '' ou None ne se trouve pas dans la troisième position, et True si l'on de ces valeurs est trouvé. Partiellement adapté de Best way to check if a list is empty.

Questions connexes