48

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

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测试所有函数的可迭代对象 s True)。我要的是一些像allcmp()这样的函数,它需要两个参数:一个可迭代的和一个比较值。我在问是否有一个内置函数可以做类似于我的 make up allcmp()

allcmp()由于我的 C 背景,memcmp()我打电话给我的,我的组合函数的名称在这里无关紧要

4

6 回答 6

102

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

all(v == 0 for v in values)

编辑:

all是标准的 Python 内置。如果你想成为高效的 Python 程序员,你应该知道其中的一半以上(http://docs.python.org/library/functions.html)。争论这个alltrue名字比争论应该叫allC更好。是主观的,但我认为大多数人更喜欢内置插件的较短名称。这是因为无论如何您都应该知道它们在做什么,并且您必须大量输入它们。whilewhiletrue

使用生成器比使用 numpy 更好,因为生成器具有更优雅的语法。numpy 可能更快,但您只会在极少数情况下受益(如所示的生成器速度很快,只有当此代码成为程序中的瓶颈时,您才会受益)。

你可能不能指望 Python 提供更多的描述性。

PS。如果您以 memcpm 样式执行此操作,以下是代码(我更喜欢所有版本,但也许您会喜欢这个):

list(l) == [0] * len(l)
于 2010-08-19T21:11:58.057 回答
23

如果您知道可迭代将仅包含整数,那么您可以这样做:

if not any(values):
    # etc...
于 2010-08-19T20:34:12.150 回答
8

如果 values 是一个 numpy 数组,您可以编写

import numpy as np
values = np.array((0, 0, 0, 0, 0))
all(values == 0)
于 2010-08-20T16:42:02.397 回答
7

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

values = (0, 0, 0, 0, 0)
print (any(values)) # return False
于 2020-01-02T17:07:13.100 回答
1

内置set函数被赋予一个可迭代对象并返回一个唯一值的集合(集合)。

所以它可以在这里用作:

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

文档中有关 python set-types-set-frozenset 的更多信息

于 2019-07-16T20:45:27.067 回答
1

我更喜欢使用否定:

all(not v for v in values)
于 2020-12-02T00:06:31.083 回答