检查iterable的所有值是否为零

时间:2010-08-19 20:32:30

标签: python iterable

是否有一种好的,简洁的/内置的方式来查看迭代中的所有值是否为零?现在我正在使用all()一点列表理解,但(对我来说)似乎应该有一个更具表现力的方法。我认为这有点等同于C中的memcmp()

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中是否存在该函数,我只是盲目,或者我应该坚持原始版本?

更新

我并不是说allcmp()是解决方案。这是我认为可能更有意义的一个例子。这不是我建议用于Python的新内置插件的地方。

在我看来,all()并没有那么有意义。它没有表达“所有”正在检查的内容。您可以假设all()采用可迭代的方式,但它不表示函数正在查找的内容(bool的可迭代的True来测试allcmp()的所有内容。我要求的是某些函数,比如 my allcmp(),它有两个参数:一个可迭代的和一个比较值。我在问是否有一个内置函数可以执行类似于我编写的allcmp()

我打电话给我的memcmp(),因为我的C背景和{{1}},我的补充功能的名称无关紧要

6 个答案:

答案 0 :(得分:55)

在这种情况下使用生成器而不是列表:

all(v == 0 for v in values)

修改

all是内置的标准Python。如果你想成为高效的Python程序员,你应该知道其中一半以上(http://docs.python.org/library/functions.html)。认为alltrueall更好的名称就像是在争论C while应该调用whiletrue。是主观的,但我认为大多数人更喜欢内置插件的短名称。这是因为你应该知道他们做了什么,你必须经常输入它们。

大多数Python程序员都会理解我在几秒钟内编写的代码。我可能会在我的girlfried上测试这段代码(她是架构师,不是程序员,从不使用Python),我想她会得到它。使用生成器比使用numpy更好,因为生成器具有更优雅的语法。 numpy可能会更快,但只有在极少数情况下你才会受益(像我展示的生成器很快,只有当你的程序中存在瓶颈时才会受益)。

你可能不会指望没有更多来自Python的描述。

PS。这是代码,如果你这样做的memcpm风格(我喜欢所有版本更多,但也许你会喜欢这个):

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

答案 1 :(得分:12)

如果您知道iterable只包含整数,那么您可以这样做:

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

答案 2 :(得分:4)

如果值是一个numpy数组,你可以写

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

答案 3 :(得分:0)

内置的set被赋予可迭代性,并返回唯一值的集合(集合)。

因此它可以在此处用作:

set(it) == {0}
  • 假设it是可迭代的
  • {0}是仅包含零的集合

有关docs中python set-types-set-frozenset here的更多信息。

答案 4 :(得分:0)

any()函数可能是实现这一目标的最简单方法。如果iterable为空,例如所有元素均为零,它将返回False。

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

答案 5 :(得分:0)

我更喜欢使用否定:

all(not v for v in values)