web-dev-qa-db-fra.com

Vérifiez si toutes les valeurs d'itérable sont nulles

Existe-t-il un bon moyen succinct/intégré pour voir si toutes les valeurs d'un itérable sont des zéros? En ce moment j'utilise all() avec une petite compréhension de liste, mais (pour moi) il semble qu'il devrait y avoir une méthode plus expressive. Je considérerais cela comme quelque peu équivalent à une memcmp() en C.

values = (0, 0, 0, 0, 0)
# Test if all items in values Tuple are zero
if all([ v == 0 for v in values ]) :
    print 'indeed they are'

Je m'attendrais à une fonction intégrée qui fait quelque chose comme:

def allcmp(iter, value) :
    for item in iter :
        if item != value :
            return False
    return True

Cette fonction existe-t-elle dans python et je suis juste aveugle, ou devrais-je simplement m'en tenir à ma version originale?

Mettre à jour

Je ne dis pas que allcmp() est la solution. C'est un exemple de ce que je pense pourrait être plus significatif. Ce n'est pas l'endroit où je suggérerais de nouvelles intégrations pour Python.

À mon avis, all() n'est pas si significatif. Il n'exprime pas ce que "tout" recherche. Vous pouvez supposer que all() prend un itérable, mais il n'exprime pas ce que la fonction recherche (un itérable de bools qui les teste tous pour True) . Ce que je demande, c'est une fonction comme ma allcmp() qui prend deux paramètres: une valeur itérable et une valeur de comparaison. Je demande s'il y a une fonction intégrée qui fait quelque chose de similaire à ma allcmp() composée.

J'ai appelé le mien allcmp() à cause de mon arrière-plan C et memcmp(), le nom de ma fonction composée n'est pas pertinent ici.

29
mjschultz

Utilisez des générateurs plutôt que des listes dans des cas comme celui-ci:

all(v == 0 for v in values)

Modifier:

all est standard Python intégré. Si vous voulez être efficace Python programmeur, vous devriez en connaître probablement plus de la moitié (- http://docs.python.org/library/functions.html ). Faire valoir que alltrue est meilleur nom que all, c'est comme argumenter que C while devrait être appelé whiletrue. Est subjectif, mais je pense que la plupart des gens préfèrent des noms plus courts pour les intégrés. C'est parce que vous devez savoir ce qu'ils font de toute façon, et vous devez les taper beaucoup .

La plupart des Python comprendront le code que j'ai écrit en quelques secondes. Je vais probablement tester ce code sur ma copine (elle est architecte, pas programmeuse, n'a jamais utilisé Python) et je pense qu'elle l'obtiendra . L'utilisation de générateurs est meilleure que l'utilisation de numpy car les générateurs ont une syntaxe plus élégante. Numpy peut être plus rapide, mais vous n'en bénéficierez que dans de rares cas (les générateurs comme je l'ai montré sont rapides, vous ne bénéficierez que si ce code est un goulot d'étranglement dans votre programme).

Vous ne pouvez probablement rien attendre de plus descriptif de la part de Python.

PS. Voici le code si vous faites cela dans le style memcpm (j'aime plus toutes les versions, mais peut-être que vous aimerez celle-ci):

list(l) == [0] * len(l)
57
Tomasz Wysocki

Si vous savez que l'itérable ne contiendra que des entiers, vous pouvez simplement le faire:

if not any(values):
    # etc...
12
Mark Byers

Si values ​​est un tableau numpy, vous pouvez écrire

import numpy as np
values = np.array((0, 0, 0, 0, 0))
all(values == 0)
4
John La Rooy

La fonction any () peut être le moyen le plus simple et le plus simple d'y parvenir. Si l'itérable est vide, par exemple. tous les éléments sont nuls, il retournera Faux.

values = (0, 0, 0, 0, 0)
print (any(values)) # return False
0
Harry

Le set intégré reçoit un itérable et retourne une collection (ensemble) de valeurs uniques.

Il peut donc être utilisé ici comme:

set(it) == {0}
  • en supposant que it est l'itérable
  • {0} est un ensemble ne contenant que zéro

Plus d'informations sur python set-types-set-frozenset ici dans les documents.

0
Bloop93