最节省时间/空间的方法来检查整数列表中的所有元素是否为0

时间:2018-11-26 07:46:38

标签: python python-2.7 python-2.x

这是Python 2.7的实现问题

说我有一个名为nums的整数列表,我需要检查nums中的所有值是否等于零。 nums包含许多元素(即超过10000个),并且包含许多重复值。

使用all()

if all(n == 0 for n in set(nums)):  # I assume this conversion from list to set helps?
    # do something

使用集合减法:

if set(nums) - {0} == set([]):
    # do something

编辑:用户U9-Forward提供的更好的方法,用于上述方法

if set(nums) == {0}:
    # do something

每种方法的时间和空间复杂度如何比较?有没有更有效的方法来检查这一点?

注意:在这种情况下,我试图避免使用numpy / pandas。

4 个答案:

答案 0 :(得分:2)

nums的任何设置转换都无济于事,因为它会迭代整个列表:

if all(n == 0 for n in nums):
    # ...

很好,因为它停在第一个非零元素上,而忽略了其余部分。

渐近而言,所有这些方法对于随机数据都是线性的。 实现细节(在生成器上没有重复的函数调用)可使not any(nums)更快,但这取决于缺少0等其他虚假元素,例如''None

答案 1 :(得分:2)

not any(nums)可能是最快的,因为它会在/发现任何非零元素时停止。

性能比较:

a = range(10000)
b = [0] * 10000
%timeit not any(a) # 72 ns, fastest for non-zero lists
%timeit not any(b) # 33 ns, fastest for zero lists
%timeit all(n == 0 for n in a) # 365 ns
%timeit all(n == 0 for n in b) # 350 µs
%timeit set(a)=={0} # 228 µs
%timeit set(b)=={0} # 58 µs

答案 2 :(得分:0)

如果可以使用numpy,则(np.array(nums) == 0).all()应该这样做。

答案 3 :(得分:0)

除了@schwobaseggl的答案,第二个示例甚至可能更好:

if set(nums)=={0}:
    # do something