4

これは私が試したことです:

def recursive_list_counter(l):
    sum = 0
    for e in l:
        if type(e) == type([]):
            #print e
            sum += 1
            recursive_list_counter(e)
    return sum 

# should be 6 if I count the first also
recursive_list_counter([[[13, 7], 90], 2, [1, 100, [5, [2]]], 8, 6])

再帰を使用して、リスト内のリストの数を取得し、元のリストもカウントしたいと考えています。

4

6 に答える 6

10

再帰呼び出しは、返されたものを無視します。戻り値を追加します。

def recursive_list_counter(l):
    sum = 0
    for e in l:
        if isinstance(e, list):
            sum += 1
            sum += recursive_list_counter(e)
    return sum 

外側のリストはカウントで無視されるため、呼び出しは 6 ではなく 5 を返すことに注意してください。

さらに、isinstance()オブジェクトが特定のタイプであるかどうかをテストするために使用する必要があります。

を見たい場合は、関数で現在のリストを6カウントし、ネストされたリストのカウントを再帰呼び出しに任せます。

def recursive_list_counter(l):
    sum = 1
    for e in l:
        if isinstance(e, list):
            sum += recursive_list_counter(e)
    return sum 
于 2013-10-30T10:48:49.367 に答える
3

これでうまくいくはずだと思います。しかし、私は遅すぎたと思います。すでに他の3つの回答が表示されています。:P

#!/usr/bin/env python

def lcount(l):
    count = 0 
    if isinstance(l, list):
        count+=1
        count+=sum([lcount(x) for x in l]) 

    return count


list_ = [ [ [1, 2, 3], [1, 4, 5], [7, 8, 9]], [ 1, 2, 7], 1, 3, ]
print lcount(list_)
于 2013-10-30T10:54:33.933 に答える
3

真の機能ソリューションは次のようになります。

def recursive_list_counter(li):
  return 1 + sum(map(recursive_list_counter, li)) if isinstance(li, list) else 0

リスト内のすべての要素をカウントするには、このわずかに変更されたバージョンを使用します。

def recursive_element_counter(li):
  return sum(map(recursive_element_counter, li)) if isinstance(li, list) else 1
于 2013-10-30T11:00:29.240 に答える
3

3 つの重要なポイント:

  • isinstance種類の確認に使用
  • sumすでに組み込み関数であるため、変数として使用しないでください
  • 再帰関数は停止条件で開始する必要があります (ここでは: not isinstance(l, list))

これがあなたの機能です:

def recursive_list_counter(l):
    if not isinstance(l, list):
        return 0
    return 1 + sum(recursive_list_counter(e) for e in l)
于 2013-10-30T11:00:38.580 に答える
2

実際、問題は非常に単純です。を呼び出すたびに、グローバル変数をインクリメントする代わりにrecursive_list_counter、新しいローカル変数を作成します。sum

sum = 0
def recursive_list_counter(l):
    global sum
    for e in l:
        if type(e) is list: #this is the same, but a better practice.
            #print e
            sum += 1
            recursive_list_counter(e)
    return sum 

recursive_list_counter([[[13, 7], 90], 2, [1, 100, [5, [2]]], 8, 6]) #returns 5

sum を再帰的にインクリメントすることもできます。

if type(e) is list:
    sum += 1
    sum += recursive_list_counter(e)

お役に立てれば!

于 2013-10-30T10:49:02.323 に答える