Question

Y at-il une bonne façon succincte / intégré pour voir si toutes les valeurs dans un itérable sont des zéros? En ce moment, je me sers all() avec une compréhension petite liste, mais (pour moi) il semble qu'il devrait y avoir une méthode plus expressive. Je considère cela comme un peu l'équivalent à un 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'

J'attendre 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

Est-ce que la fonction exist en python et je suis juste aveugle, ou devrais-je rester avec ma version originale?

Mise à jour

Je ne suggère pas que allcmp() est la solution. Il est un exemple de ce que je penser peut-être plus significatif. Ce n'est pas l'endroit où je vous suggère de nouvelles Encastrements pour Python.

À mon avis, all() est pas significatif. Il n'exprime pas ce « tout » pour vérifier est. Vous pouvez supposer que all() prend un itératives, mais il ne se prononce pas ce que la fonction recherche (un itérables de bools qui teste tous pour True). Ce que je demande est une fonction comme mon allcmp() qui prend deux paramètres: une itérables et une valeur de comparaison. Je me demande s'il y a une fonction intégrée qui fait quelque chose de semblable à mon composé allcmp().

J'ai appelé allcmp() moi à cause de mon arrière-plan C et memcmp(), le nom de ma composé fonction est hors de propos ici.

Était-ce utile?

La solution

Utiliser des générateurs plutôt que des listes dans des cas comme celui:

all(v == 0 for v in values)

Modifier

all est intégré dans la norme Python. Si vous voulez être programmeur Python efficace, vous devez probablement savoir plus de la moitié d'entre eux ( http: // docs .python.org / bibliothèque / functions.html ). Faisant valoir que alltrue est meilleur nom que all est comme en faisant valoir que C while devrait être appel whiletrue. Est subjective, mais je pense que la plupart des gens préfèrent des noms plus courts pour built-ins. Ceci est parce que vous devez savoir ce qu'ils font de toute façon, et vous devez les taper beaucoup.

La plupart des programmeurs Python comprendre le code que j'ai écrit en quelques secondes. Je vais tester probablement ce code sur mon girlfried (elle est architecte, pas un programmeur, jamais utilisé Python) et je pense qu'elle va l'obtenir. L'utilisation 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 profitera que dans des cas rares (générateurs comme je l'ai montré sont rapides, vous bénéficiez que si ce code est goulot d'étranglement dans votre programme).

Vous avez probablement ne peut rien attendre plus descriptif de Python.

PS. Voici le code si vous faites cela dans un style memcpm (I comme toute version plus, mais peut-être que vous aimerez celui-ci):

list(l) == [0] * len(l)

Autres conseils

Si vous savez que le itérables ne contiendra que des entiers, alors vous pouvez simplement faire ceci:

if not any(values):
    # etc...

Si les valeurs est un tableau numpy vous pouvez écrire

import numpy as np
values = np.array((0, 0, 0, 0, 0))
all(values == 0)

Le haut-set est donné un iterable et renvoie une collection (set) de valeurs uniques.

Il peut donc être utilisé ici comme:

set(it) == {0}
  • en supposant it est itérable
  • {0} est un ensemble contenant seulement zéro

Plus d'info sur python set-types-set-frozenset

scroll top