Le blog: Web, Python, Django, Javascript ...

Python Quizz: Un pour tous et tous pour un

Un quizz assez simple pour aujourd'hui : Comment savoir si tous les éléments d'une séquence ont une valeur vraie? De même, comment savoir si tous les éléments ont une valeur fausse?

Mise à jour le 10 mai 2011

Bravo à Medhi qui a trouvé la réponse puisque la solution passe effectivement par les 2 fonctions all et any.

Rien à importer ici puisque ce sont des fonctions internes du langage Python.

Pour savoir si tous les éléments d'une séquence ont une valeur vraie, on utilise all

>>>all([True, True, True])
True
>>>all([True, False, True])
False

Pour savoir si tous les éléments ont une valeur fausse, on utilise any qui retourne vrai si au moins un élément a une valeur vraie. Il suffit alors d'inverser le résultat de any pour savoir si tous les éléments ont une valeur fausse.

>>>not any([False, False, False])
True
>>>not any([True, False, True])
False

Ces 2 fonctions peuvent se révéler bien pratique.

La réponse de Medhi fait les 2 tests à la fois en utilisant judicieusement la méthode tee de la librairie itertools. Cette librairie est une véritable mine d'or pour les traitements sur les séquences. Je vous conseille d'y jeter un oeil si vous ne la connaissez pas encore.

Juste une remarque sur la réponse proposée. Il y a dans les exemples, des listes imbriquées. Dans ce cas, all et any ne travaillent pas sur les éléments de la liste imbriquée mais sur la liste elle-même: un élément liste est vrai si la liste n'est pas vide.

On aura donc dans les cas suivants:

>>>all([1,1,[False, 1]])
True
>>>all([1, 1, []])
False

Le traitement des listes imbriquées est légèrement plus complexe et fera peut-être l'objet d'un prochain Python Quizz.


Comments rss
Posted by Mehdi Lahmam B. on Saturday 07 May 2011 à 13:43
Salut !
un all et any font l'affaire.
Et avec tee() de itertools on peut lui envoyer tout ce qu'on veut sans prise de tête ;-)

>>>

import itertools

def unanimous(it):
it1, it2 = itertools.tee(it)
return all(it1) or not any(it2)

print unanimous([0,False,0,0,False]) #True
print unanimous([1,1,[True, 1]]) #True
print unanimous((1,0, False)) #False

Name: Email: URL: Comment: If you enter anything in this field your comment will be treated as spam: Captcha: captcha