Vérifier si toutes les valeurs de iterable sont égales à zéro

Existe-t-il un bon moyen de voir si toutes les valeurs d'un itératif sont des zéros? Maintenant je suis à l'aide de all() avec un peu de compréhension de liste, mais (pour moi) il semble qu'il devrait y avoir une méthode plus expressive. Je pense que c'est un peu l'équivalent d'un memcmp() 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'attends à 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 en python et je suis juste aveugle, ou devrais-je simplement rester avec mon version originale?

mise à Jour

Je ne suggère pas que allcmp() est la solution. C'est un exemple de ce que j' penser pourrait être plus significatif. Ce n'est pas l'endroit où je suggérerais de nouveaux built-ins pour Python.

À mon avis, all() n'est-ce pas significatif. Il n'exprime pas ce que "tout" cherche. Vous pourriez supposer que all() prend un itérable, mais il n'exprime pas ce que la fonction recherche (un itérable de bools que les tests de tous True). Ce que je demande, c'est une fonction comme mon allcmp() cela 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 à mon inventé allcmp().

j'ai appelé le mien allcmp() en raison de mes antécédents de C et memcmp(),le nom de ma fonction inventée n'est pas pertinent ici.

20
demandé sur mjschultz 2010-08-20 00:32:29

3 réponses

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

all(v == 0 for v in values)

Edit:

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

la plupart des programmeurs 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 va l'obtenir. Utiliser des générateurs est mieux que d'utiliser numpy parce que les générateurs ont une syntaxe plus élégante. numpy peut être plus rapide, mais vous ne bénéficierez que dans de rares cas (générateurs comme J'ai montré sont rapides, vous ne bénéficierez que si ce code est goulot d'étranglement dans votre programme).

vous ne pouvez probablement rien attendre de plus descriptif 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)
52
répondu Tomasz Wysocki 2012-06-11 06:35:22

si vous savez que l'itérable ne contiendra que des entiers, alors vous pouvez juste faire ceci:

if not any(values):
    # etc...
11
répondu Mark Byers 2013-05-16 12:06:30

si valeurs est un tableau numpy vous pouvez écrire

import numpy as np
values = np.array((0, 0, 0, 0, 0))
all(values == 0)
3
répondu John La Rooy 2010-08-20 16:42:02