Убедитесь, что все значения итерации равны нулю

Есть ли хороший, сжатый/встроенный способ увидеть, являются ли все значения в итерабельном нули? Прямо сейчас я использую all() с небольшим пониманием списка, но (для меня) кажется, что должен быть более выразительный метод. Я бы рассматривал это как несколько эквивалентное 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'

Я бы ожидал встроенной функции, которая делает что-то вроде:

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

Эта функция существует в python, и я просто ослеп, или я должен просто придерживаться своей первоначальной версии?

Update

Я не предполагаю, что allcmp() является решением. Это пример того, что, по моему мнению, может быть более значимым. Это не то место, где я бы предложил новые встроенные модули для Python.

По-моему, all() не имеет смысла. Он не выражает, что "все" проверяет. Вы можете предположить, что all() выполняет итерацию, но не выражает то, что ищет функция (итерабельность bool, которая проверяет их все на True). То, что я прошу, это некоторая функция, например my allcmp(), которая принимает два параметра: итерабельное и сравнительное значение. Я спрашиваю, есть ли встроенная функция, которая делает что-то похожее на мой сделанный allcmp().

Я назвал мой allcmp() из-за моего фона C и memcmp(), имя моей созданной функции не имеет значения здесь.

Ответы

Ответ 1

Используйте генераторы вместо списков в таких случаях:

all(v == 0 for v in values)

Edit:

all является стандартным встроенным Python. Если вы хотите быть эффективным программистом на Python, вы должны знать, вероятно, более половины из них (http://docs.python.org/library/functions.html). Утверждение, что alltrue лучше имени, чем all, похоже на утверждение, что C while должен быть вызван whiletrue. Является субъективным, но я думаю, что большинство людей предпочитают короткие имена для встроенных модулей. Это потому, что вы должны знать, что они делают в любом случае, и вы должны набирать их много.

Большинство программистов на Python поймут код, который я написал за считанные секунды. Вероятно, я испытаю этот код на моей девушке (она архитектор, а не программист, никогда не использовал Python), и я думаю, что она это получит. Использование генераторов лучше, чем использование numpy, потому что генераторы имеют более элегантный синтаксис. numpy может быть быстрее, но вы выиграете только в редких случаях (генераторы, как я показал, быстры, вы выиграете, только если этот код является узким местом в вашей программе).

Вероятно, вы не можете ожидать ничего более описательного из Python.

PS. Вот код, если вы делаете это в стиле memcpm (мне больше нравится вся версия, но, возможно, вам понравится этот):

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

Ответ 2

Если вы знаете, что итерабель будет содержать только целые числа, вы можете просто сделать это:

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

Ответ 3

Если значения представляют собой массив numpy, вы можете написать

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

Ответ 4

Встроенному set дается итерация, и он возвращает коллекцию (набор) уникальных значений.

Так что это может быть использовано здесь как:

set(it) == {0}
  • при условии, it это итеративный
  • {0} это набор, содержащий только ноль

Больше информации о python set-types-set-frozenset здесь, в документации.