1

リスト内のすべての項目が 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
4

3 に答える 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))
于 2013-01-19T19:14:41.003 に答える
1

次のことを試すことができます。

def ifeveryitems(lst):
    return all(map(lambda x: x < 2, lst)) 
于 2013-01-19T19:20:56.693 に答える
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:]し、関数自体を使用してリスト ( ) の残りをチェックします。最終的には、ショートカットによって False を返す (isinstance(lst[0],list) and len(lst[0]) <= 2が False の場合) か、リスト全体が使い尽くされて True を返す場合の基本ケースに到達します。


len(L)もう 1 つの例:自分で実装する場合。常にリストである
と仮定すると、ループを使用して実装できます。Llen

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 を返すだけです。

于 2013-01-19T19:24:02.620 に答える