2013-01-19 35 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