簡體   English   中英

檢查列表中的所有數字是否與Python中的符號相同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM