检查Python列表中所有数字是否符号相同?

5 投票
4 回答
6583 浏览
提问于 2025-04-17 13:59

我怎么知道一个数字列表(或者说可迭代的对象)里的数字是不是都带有相同的符号呢?

这是我最初的(简单)想法:

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风格的方法。

撰写回答