Use*_*ser 4 python sign list python-2.7
如何判断列表(或可迭代)的数字是否都具有相同的符号?
这是我的第一个(幼稚)草案:
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)
Run Code Online (Sandbox Code Playgroud)
有更多的pythonic和/或正确的方法吗?首先想到的是一旦你有相反的迹象就停止迭代.
更新
到目前为止,我喜欢这些答案,尽管我对表现感到疑惑 我不是一个表演迷,但我认为在处理列表时考虑性能是合理的.对于我的特定用例,我不认为这将是一个大问题,但为了完整这个问题,我认为解决它是好的.我的理解是min和max函数具有O(n)性能.到目前为止,两个建议的答案具有O(2n)性能,而一旦检测到相反的符号,我的上述例程添加短路退出将具有最差的O(n)性能.思考?
Roh*_*ain 18
你可以利用all功能: -
>>> x = [1, 2, 3, 4, 5]
>>> all(item >= 0 for item in x) or all(item < 0 for item in x)
True
Run Code Online (Sandbox Code Playgroud)
不知道这是否是最蟒蛇的方式.
NPE*_*NPE 14
怎么样:
same_sign = not min(l) < 0 < max(l)
Run Code Online (Sandbox Code Playgroud)
基本上,这会检查最小元素l和最大元素是否跨越零.
这不会短路,但会避免Python循环.只有基准测试可以判断这对您的数据是否是一个很好的权衡(以及这件作品的性能是否也很重要).