检查Python列表中所有数字是否符号相同?
我怎么知道一个数字列表(或者说可迭代的对象)里的数字是不是都带有相同的符号呢?
这是我最初的(简单)想法:
def all_same_sign(list):
negative_count = 0
for x in list:
if x < 0:
negative_count += 1
return negative_count == 0 or negative_count == len(list)
有没有更符合Python风格或者更正确的方法来做到这一点呢?我想到的第一件事就是,一旦发现符号相反,就停止继续检查。
更新
到目前为止,我喜欢大家的回答,不过我有点担心性能问题。我并不是特别追求性能,但我觉得在处理列表时考虑性能是合理的。对我来说,这个问题可能不太重要,但为了完整性,我觉得还是有必要提一下。我的理解是,min和max这两个函数的性能是O(n)。而到目前为止,两个建议的答案性能都是O(2n),而我上面提到的那种方法,如果一旦发现符号相反就提前退出,最坏情况下的性能是O(n)。你们怎么看?
4 个回答
3
你可以用 any
来代替 all
,因为它会在找到第一个为真的项时就停止继续检查了:
same = lambda s: any(i >= 0 for i in s) ^ any(i < 0 for i in s)
16
这样怎么样:
same_sign = not min(l) < 0 < max(l)
基本上,这段代码是用来检查列表 l
中最小的元素和最大的元素是否跨越了零这个数字。
这个方法不会提前结束,但它避免了使用Python中的循环。只有通过测试才能知道这种做法对你的数据是否合适(以及这段代码的性能是否真的重要)。
22
你可以使用 all
这个函数来实现:-
>>> x = [1, 2, 3, 4, 5]
>>> all(item >= 0 for item in x) or all(item < 0 for item in x)
True
我不确定这是不是最符合Python风格的方法。