web-dev-qa-db-fra.com

Si tout dans la liste == quelque chose

En utilisant Python 2.6, existe-t-il un moyen de vérifier si tous les éléments d'une séquence sont égaux à une valeur donnée, dans une seule instruction?

[pseudocode]
my_sequence = (2,5,7,82,35)

if all the values in (type(i) for i in my_sequence) == int:
     do()

Au lieu de, dites:

my_sequence = (2,5,7,82,35)
all_int = True
for i in my_sequence:
    if type(i) is not int:
        all_int = False
        break

if all_int:
    do()
25
Zoomulator

Utilisation:

all( type(i) is int for i in lst )

Exemple:

In [1]: lst = range(10)
In [2]: all( type(i) is int for i in lst )
Out[2]: True
In [3]: lst.append('steve')
In [4]: all( type(i) is int for i in lst )
Out[4]: False

[Éditer]. Fait plus propre selon les commentaires.

55
Autoplectic

Tu veux dire

all( type(i) is int for i in my_list )

?

Edit: remplacé par is. Un peu plus vite.

13
S.Lott

Je voudrais suggerer:

if all(isinstance(i, int) for i in my_list):

all et any sont apparus pour la première fois en 2006 avec Python 2.5 (fonctionnalité implémentée par Raymond Hettinger) .
Si vous utilisez une ancienne version de Python, les liens fournissent des exemples d'implémentations.

Je suggère également d'utiliser isinstance car il attrapera également les sous-classes de int.

8
tzot

Par souci d'exhaustivité, j'ai pensé ajouter le fait que "tout" de NumPy est différent du "tout" intégré. Si, par exemple, exécutez Python via Python (x, y), NumPy est chargé automatiquement (et ne peut pas être déchargé pour autant que je sache), donc lorsque vous essayez d'exécuter le code ci-dessus, cela produit plutôt inattendu résultats:

>>> if (all(v == 0 for v in [0,1])):
...     print 'this should not happen'
... this should not happen

Plus d'informations à ce sujet dans la question Stack Overflow numpy tous diffèrent de tout intégré. Comme solution, vous pouvez soit entourer le générateur de crochets pour produire une liste:

>>> all( [v == 0 for v in [0,1]] )
False

Ou appelez explicitement la fonction intégrée:

>>> __builtins__.all(v == 0 for v in [0,1,'2'])
False

J'ai trouvé un moyen d'empêcher Spyder d'importer NumPy par défaut: Liste d'importation du module par défaut Spyder

1
MacL3an