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