2012-03-31 11 views
2

私はp = [[[[[[[[1, 2, 3]]]]]]]]のようなリストを持っています。空リストを含むリスト内のアイテムの数を取得したいので、このリストでは10を取得します。リストを列挙しようとしています。 -Pythonでリスト内のサブリストを数えよう

for idx, item in enumerate(p): 
    count = count + idx 

ただし、空のリストを取得できません。ご意見をお聞かせください。

+3

空のリストがそこにはありません。 – jamylak

+0

あなたはそのリストを10点取得する方法を説明できますか? –

+0

彼は各リスト内のアイテムの数を数え、それらを一緒に追加します – jamylak

答えて

6

短いバージョン:

>>> def recur_len(l): 
     return sum(1 + recur_len(item) if isinstance(item,list) else 1 for item in l) 

>>> recur_len([[[[[[[[1, 2, 3]]]]]]]]) 
10 

より詳細なコード

>>> def recur_len(l): 
     count = 0 
     for item in l: 
      if isinstance(item,list): 
       count += 1 + recur_len(item) 
      else: 
       count += 1 
     return count 

>>> recur_len([[[[[[[[1, 2, 3]]]]]]]]) 
10 
+0

+1私は自分の答えを残しておきますが、これは実際にOPによって欲しかったものです。疑問文言はあまり明確ではなく、例はあいまいである。 –

+0

ええ、私は全体の '空のリストのもの'を理解していないことに同意します – jamylak

+0

ありがとう、次回より説明的になります。今は座って、このコードがどのように働いているのかを学ぶ時間です。ありがとうございます – Varun

2

あなたが唯一のちょうど別のリストを含有しない、最終的なリストの内容を除き、リスト(またはlistのサブクラス)と、他には何をカウントしたい場合:

def len_counting_containers(inlist): 
    count = 0 
    current = inlist 
    while len(current) == 1 and isinstance(current[0], list): 
     count += 1 
     current = current[0] 
    return count + len(current) 

len_counting_containers([[[[[[[[1, 2, 3]]]]]]]]) 

たちを与える:

10 

これは非常に壊れやすい操作です(どんな場合でも、あなたはPythonでisinstance()を使用しています)ので、着信データが常に期待通りに構造化されていることを確認してください。あなたのデータがあなたが管理するソースから来たものである場合は、あなたがデータをどのように作り出し、それをより良い形式で提供できるかを見てみることをお勧めします。例えば、(7, [1,2,3])

あなたはまた、再帰的にこれを実現することができます。

def len_counting_containers(current): 
    return len_counting_containers(current[0])+1 if len(current) == 1 and isinstance(current[0], list) else len(current) 

len_counting_containers([[[[[[[[1, 2, 3]]]]]]]]) 

をこれは、より少ないコードで同じ結果が得られますが、あなたはめちゃくちゃ大きなリストで作業している場合、これは再帰の制限を打つことができました。以下のコードの

+0

を参照してくださいありがとう、私はできるだけ多くを把握しようとしていますので、私はmyList =([1、[1、2、[3、 4]]])、私はこの操作のための2つのみを取得していますが、そこに7つの項目があります、私は自分自身をコードしようとするでしょう – Varun

+0

ああ、あなたは '空リスト'を含むと言ったので、項目。私は[ジャミラクの答え](http://stackoverflow.com/a/9955769/722121)はあなたが望むことをすると思います。 –

2
def depth(a): 
    return 1 + depth(a[0]) if type(a) is list else 0 

デモ:

a = 'x' 
for n in range(10): 
    a = [a] 
    print a, depth(a) 


## ['x'] 1 
## [['x']] 2 
## [[['x']]] 3 
## [[[['x']]]] 4 
## [[[[['x']]]]] 5 
## [[[[[['x']]]]]] 6 
## [[[[[[['x']]]]]]] 7 
## [[[[[[[['x']]]]]]]] 8 
## [[[[[[[[['x']]]]]]]]] 9 
## [[[[[[[[[['x']]]]]]]]]] 10 
+0

'code' DEF deep_count(P):PにおけるEの \t和= 0 \t: \t \t和=和+ 1 \t \t場合is_list(E): \t \t \t和=和+ deep_count(E ) \t return sum 'code' – Varun

関連する問題