这是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。
答案 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