检查iterable的所有值是否为z

2024-10-05 14:27:27 发布

您现在位置: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()接受一个iterable,但它不表示函数在寻找什么(一个由bools组成的iterable,它测试所有函数的True)。我要的是一些函数,比如myallcmp(),它有两个参数:iterable和comparison值。我在问是否有一个内置函数做了类似于我的组合allcmp()的事情。

由于我的C背景和我的组合函数的名称在这里是不相关的,所以我调用了我的allcmp()


Tags: 方法函数inforreturnifvalueall
3条回答

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

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

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

all(v == 0 for v in values)

编辑:

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

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

您可能不希望Python有更多的描述。

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

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

如果值是numpy数组,则可以编写

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

相关问题 更多 >