检查iterable的所有值是否为零

mjs*_*ltz 26 python iterable

是否有一种好的,简洁的/内置的方式来查看迭代中的所有值是否为零?现在我正在使用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'
Run Code Online (Sandbox Code Playgroud)

我希望内置函数可以执行以下操作:

def allcmp(iter, value) :
    for item in iter :
        if item != value :
            return False
    return True
Run Code Online (Sandbox Code Playgroud)

这个函数是否存在于python中,我只是盲目的,或者我应该坚持使用我的原始版本?

更新

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

在我看来,all()这不是那么有意义.它没有表达"所有"正在检查的内容.你可以假设它all()采用了一个可迭代的,但它没有表达函数正在寻找的东西(一个可迭代的bools测试所有它们True).我要求的是 my allcmp()这样的函数,它有两个参数:一个可迭代的和一个比较值.我在问是否有内置函数可以执行与我编写的类似的操作allcmp().

我打电话给我的allcmp()是因为我的C背景memcmp(),我的编造功能的名称在这里无关紧要.

Tom*_*cki 59

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

all(v == 0 for v in values)
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

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

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

list(l) == [0] * len(l)
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 12

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

if not any(values):
    # etc...
Run Code Online (Sandbox Code Playgroud)

  • -1当你对代码进行大量评论以便非狡猾的人能够理解时,你也可以编写'all(v == 0 for v in values)`这是不言自明的和未来的证据(当你决定它应该是一个非零的整数). (3认同)
  • 抛开代码实践主观性不谈,“如果没有”是正确的英语,因为它是可读的代码。此外,在物理学等某些应用中,0 客观上被称为“静止”或“关闭”,那么此代码既具有可读性,也具有可维护性。 (2认同)

Har*_*rry 7

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

values = (0, 0, 0, 0, 0)
print (any(values)) # return False
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 5

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

import numpy as np
values = np.array((0, 0, 0, 0, 0))
all(values == 0)
Run Code Online (Sandbox Code Playgroud)