2013-01-19 32 views
1

我試圖定義一個函數,如果列表中的每個項目小於2,則返回true,否則返回false。項目的類型可以是與列表不同的整數,浮點數,字符串或數字。我應該檢查清單。看你的描述Python中的每個項目的長度

def ifeveryitems(lst): 
    for items in lst: 
     if isinstance(items,list) and len(items) <= 2: 
      return True and ifeveryitems(????) # '????' should be the items other than the item that has been searched # 
     else: 
      return False 

回答

5

,你並不需要一個遞歸調用都:

def ifeveryitems(lst): 
    for items in lst: 
     if isinstance(items, list) and len(items) > 2: 
      return False 

    return True 

,或者:

def ifeveryitems(lst): 
    return all(len(items) <= 2 for items in lst if isinstance(items, list)) 
+0

非常感謝!這正是我正在尋找的! –

+1

'如果isinstance(items,list))'all(len(items)<= 2)'可能更具可讀性 – jfs

+0

@ J.F.Sebastian:好點! – Ryan

1

你可以嘗試以下方法:

def ifeveryitems(lst): 
    return all(map(lambda x: x < 2, lst)) 
+0

你不能比較一個列表像這樣的整數... – Ryan

+0

這個問題說:「我試圖定義一個函數,如果列表中的每個項目都小於2,並在其他情況下返回false,則返回true。「我認爲這個解決方案符合這個要求,儘管我可能誤解了它的含義,如果」少於2「意味着」是少於兩個元素的列表「,那麼這個方法就行不通了 – samfrances

+0

啊,對不起,我不小心組合了代碼問題:P – Ryan

1

隨着您的問題解決,我w應該一般性地解釋循環與尾遞歸的概念,因爲尾遞歸通常是一種有用的技術。
儘管Python中的循環和列表理解意味着您不太可能需要尾遞歸,但有一個想法是很好的。


遞歸調用函數的技術稱爲尾遞歸。使用尾遞歸和循環可以達到同樣的效果,但是你不需要兩者。

,做你想做,你可以使用一個循環什麼:

def ifeveryitems(lst): 
    for items in lst: 
     if not isinstance(items,list) or len(items) > 2: 
      return False 
    return True 

或尾遞歸:

def ifeveryitems(lst): 
    if isinstance(items,list) and len(lst)==0: 
     return True 
    return isinstance(lst[0],list) and len(lst[0]) <= 2 and ifeveryitems(lst[1:]) 

此功能檢查的lst的第一個項目是列表,是一個長度爲2或更少,然後使用函數本身檢查列表的其餘部分(lst[1:])。最終,它會通過快捷方式返回False(當isinstance(lst[0],list) and len(lst[0]) <= 2爲False時)或到達整個列表耗盡的基本情況,此時它將返回True。


再舉一個例子:自己實現len(L)
假設L將永遠是一個列表,你可以使用一個循環實現len

def len(L): 
    i = 0 
    for item in L: 
     i += 1 
    return i 

(注:使用這​​樣的循環也被稱爲累積)

或尾遞歸。

def len(L): 
    if L==[]: 
     return 0 
    return 1 + len(l[1:]) 

它刪除列表中的第一個項目,並將其餘列表的長度加1。最終,它會達到L耗盡的地步,並被減少到空列表,在這種情況下,它將返回0.

+0

非常感謝! –

+2

Python沒有tail-call消除功能,所以tail-recursion解決方案很少用到,你忘記了'ifeveryitems()'中的'return',你的'len()由於'1 +'遞歸,試試這個:'size = lambda L,total = 0:size(L [1:],total + 1)if L else total'。 – jfs

+0

看看[SICP中的圖片]( http://mitpress.mit.edu/sicp/full-text/book/book-ZH-11.html#%25_sec_1.2.1)來理解爲什麼你的'len()'帶'return 1 + len()'是不是尾遞歸,'len()'調用不在尾部,'add'運算符位於尾部位置:'return add(1,len())',並將其與size()函數(可以將它重寫爲多行「def」與len()顯式不同) – jfs