[英]Check if all numbers in a list are same sign in 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)
有更多的pythonic和/或正確的方法嗎? 首先想到的是一旦你有相反的跡象就停止迭代。
更新
到目前為止,我喜歡這些答案,盡管我對表現感到疑惑 我不是一個表演迷,但我認為在處理列表時考慮性能是合理的。 對於我的特定用例,我不認為這將是一個大問題,但為了完整這個問題,我認為解決它是好的。 我的理解是min和max函數具有O(n)性能。 到目前為止,兩個建議的答案具有O(2n)性能,而一旦檢測到相反的符號,我的上述例程添加短路退出將具有最差的O(n)性能。 思考?
你可以利用all
功能: -
>>> x = [1, 2, 3, 4, 5]
>>> all(item >= 0 for item in x) or all(item < 0 for item in x)
True
不知道這是否是最蟒蛇的方式。
怎么樣:
same_sign = not min(l) < 0 < max(l)
基本上,這會檢查l
的最小元素和最大元素是否跨越零。
這不會短路,但會避免Python循環。 只有基准測試可以判斷這對您的數據是否是一個很好的權衡(以及這件作品的性能是否也很重要)。
而不是all
你可以使用any
,因為它也在第一個真項上短路:
same = lambda s: any(i >= 0 for i in s) ^ any(i < 0 for i in s)
與使用all
類似,您可以使用any
具有更好性能的優點,因為它會在第一次出現不同符號時中斷循環:
def all_same_sign(lst):
if lst[0] >= 0:
return not any(i < 0 for i in lst)
else:
return not any(i >= 0 for i in lst)
如果你想考慮0,這將屬於兩個組,這將是一個有點棘手:
def all_same_sign(lst):
first = 0
i = 0
while first == 0:
first = lst[i]
i += 1
if first > 0:
return not any(i < 0 for i in lst)
else:
return not any(i > 0 for i in lst)
在任何情況下,您都會迭代列表一次而不是其他答案中的兩次。 您的代碼具有在Python中迭代循環的缺點,這比使用內置函數效率低得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.