Python中每个项目的长度

问题描述 投票:1回答:3

我试图定义一个函数,如果列表中的每个项目都小于2,则返回true,否则返回false。项的类型可以是与列表不同的整数,浮点数,str或sth。我应该检查清单。

def ifeveryitems(lst):
    for items in lst:
        if isinstance(items,list) and len(items) <= 2:
           return True and ifeveryitem(????)  # '????' should be the items other than the item that has been searched #
        else:
           return False
python search
3个回答
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))

1
投票

您可以尝试以下操作:

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

1
投票

解决了您的问题后,我将一般解释循环与尾递归的概念,因为尾递归通常是一种有用的技术。尽管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:])。最终,它要么通过快捷键(当isinstance(lst[0],list) and len(lst[0]) <= 2为False时)返回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。

© www.soinside.com 2019 - 2024. All rights reserved.