2017-05-30 36 views
5

假設我們正在檢查list中是否有奇數。最直接的辦法是:如何檢查Iterable(例如列表/元組)中是否有奇數/偶數?

def has_odd(L): 
    for v in L: 
     if v % 2 == 1: 
      return True 
    return False 

has_odd功能檢查是否有在list的任何奇數,一旦奇數被發現,它返回True。但是這似乎有點冗長。使用reduce一個更簡潔的方法是如下:

reduce(lambda res, v: res or bool(v), L, False) 

但是,這將通過所有的元素進行迭代,並是不必要的,因爲一旦奇數發現結果是肯定True

那麼,有沒有其他方法可以做到這一點?

+4

'任何(INT(數字)%2位數的STR(數字))' –

+0

顯然,如果'L'是一個序列,正確的形式是'任何(編號%2數序列)'。我不知何故誤讀了一個問題,並認爲你正在檢查數字中的數字,列表中的數字。 –

回答

6

可以使用any()功能,以減少冗長:

>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> any(n % 2 == 1 for n in l) 
True 
>>> 

不過請注意,any() is pretty much the same as you had originally just generalized,所以不要指望速度提升:

def any(iterable): 
    for element in iterable: 
     if element: 
      return True 
    return False 
+2

這個_could_可以被壓縮成任何(n中的2),或者任何(n和1中的n),但是我猜你的版本更具可讀性。 –

+0

@ PM2Ring是的,你的權利。我知道我可以減少它甚至更多。但是,就像你說的,我認爲我發佈的版本更具可讀性。它並不是真的會花費太多的代價。 –

+0

我有一個小問題:在表達式'any(n%2 == 1 for n in l)','n%2 == 1 for n in l' a'generator'?它不應該是'任何((n%2 == 1)')嗎? –

1

首先是讓我們寫小指標功能爲「奇怪」像

def is_odd(number): 
    return number % 2 

然後我們可以wr伊特我們的指示器爲 「具有至少一個奇數」 使用anyimap/map

  • 的Python 2. *

    from itertools import imap 
    
    
    def has_odd_number(iterable): 
        return any(imap(is_odd, iterable)) 
    
  • 的Python 3. *

    def has_odd_number(iterable): 
        return any(map(is_odd, iterable)) 
    

generator expression

def has_odd_number(iterable): 
    return any(is_odd(number) for number in iterable) 

實例:

>>> has_odd_number([0]) 
False 
>>> has_odd_number([1]) 
True 
0

的另一種方式。您可以使用not all()

>>> l = [2, 4, 5, 6, 7, 8, 9, 10] 
>>> not all(n%2==1 for n in l) 
True 
相關問題