web-dev-qa-db-ja.com

リストの任意にネストされたリストの要素の総数を取得するにはどうすればよいですか?

変数_my_list_に割り当てられたリストがあります。 _my_list_の値は_[[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]]_です。 _my_list_の長さを調べる必要がありますが、len(my_list)は3のみを返します。11を返したいのですが、Python関数が返されますか?全長の_my_list_ネストされたリストとすべて。

例:

_Input
[[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]]

Output
11
_

これが数字だけでなく文字列でも機能するかどうかを確認します。

14
michaelpri

この関数は、リストの長さをカウントし、リスト以外のオブジェクトを長さ1としてカウントし、リストアイテムを再帰的に平坦化された長さを見つけます。インタープリターの最大スタック深度まで、任意のネストで機能します。

def recursive_len(item):
    if type(item) == list:
        return sum(recursive_len(subitem) for subitem in item)
    else:
        return 1

注:これがどのように使用されるかによっては、タプルのサイズなどを正しく判断するために、型がlistであるかどうかをチェックするよりも、アイテムが反復可能かどうかをチェックする方が良い場合があります。ただし、オブジェクトが反復可能かどうかを確認すると、文字列の長さに1を与えるのではなく、文字列内の各文字をカウントするという副作用が生じ、望ましくない場合があります。

18
stonesam92

別の方法として、flattenlenとともに使用できます。

from compiler.ast import flatten

my_list = [[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]]

len(flatten(my_list))
11

PS。 @thefourtheyeが指摘してくれてありがとう、注意してください:

バージョン2.6で廃止:コンパイラパッケージはPython 3。で削除されました)

代替案はここにあります: 非推奨のcompiler.ast flatten関数のPython 3の置き換え

6
Anzel

ハッキングソリューション、誰かがそれを投稿する必要がありました。リストを文字列に変換し(重い処理/再帰を__str__演算子に任せる)、コンマを数え、1を追加します。

>>> my_list = [[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]]
>>> str(my_list).count(",")+1
11

(整数と浮動小数点数で機能します。もちろん、コンマを含めることができるため、文字列では失敗します)

編集:このハックは空のリストを考慮していません:[]要素を削除する必要があります:

>>> my_list = [[1,2,3],[3,5,[2,3]], [[3,2],[5,[4],[]]]]  # added empty list at the end
>>> s = str(my_list)
>>> s.count(",")-s.count("[]")+1   # still 11

これは、最後に返される新しいフラット化されたリストを埋めるため、それほどパフォーマンスが高くない可能性がある代替ソリューションです。

_def flatten_list(ls, flattened_list=[]):
    for elem in ls:
        if not isinstance(elem, list): 
            flattened_list.append(elem)
        else:
            flatten_list(elem, flattened_list)
    return flattened_list
_

_flatten_list_は直感的にリストをフラット化し、次にlen()関数を使用して、新しく返されるフラット化されたリストの長さを計算できます。

_len(flatten_list(my_list))
_
2
nbro

あなたは本質的に、木の葉の数を計算する方法を探しています。

 def is_leaf(tree):
        return type(tree) != list

def count_leaves(tree):
    if is_leaf(tree):
        return 1
    else:
        branch_counts = [count_leaves(b) for b in tree]
        return sum(branch_counts)

Count_leaves関数は、ブランチのbranch_countsを再帰的に計算し、それらの結果を合計することにより、ツリー内の葉をカウントします。基本的なケースは、木が葉である場合、つまり葉が1つある木です。葉の数は木の長さ、つまり枝の数とは異なります。

2
Jobs

Tupleまたはlistの簡単な方法

Tuple

from nltk import flatten
Obj = (0.4, ((0.1, (0.05, 0.07)), (0.18, 0.2)))
print(len(flatten(list(Obj))))

List

 Obj = [[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]]
 print(len(flatten((Obj))))
0
Harry_pb

これは再帰を利用した私の最善の試みであり、標準ライブラリとビジュアルのみを使用します。カスタムライブラリを使用しないようにします

def listlength(mylist, k=0, indent=''):
    for l1 in mylist:
        if isinstance(l1, list):
            k = listlength(l1, k, indent+'  ')
        else:
            print(indent+str(l1))
            k+=1
    return k

a = [[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]]
listlength(a)
# 11

そして、十分に

a = []
x = listlength(a)
print('length={}'.format(x))
# length=0



a = [1,2,3]
x = listlength(a)
print('length={}'.format(x))
#1
#2
#3
#length=3


a = [[1,2,3]]
x = listlength(a)
print('length={}'.format(x))
#  1
#  2
#  3
#length=3


a = [[1,2,3],[1,2,3]]
x = listlength(a)
print('length={}'.format(x))
#  1
#  2
#  3
#  1
#  2
#  3
#length=6

a = [1,2,3, [1,2,3],[1,2,3]]
x = listlength(a)
print('length={}'.format(x))
#1
#2
#3
#  1
#  2
#  3
#  1
#  2
#  3
#length=9


a = [1,2,3, [1,2,3,[1,2,3]]]
x = listlength(a)
print('length={}'.format(x))
#1
#2
#3
#  1
#  2
#  3
#    1
#    2
#    3
#length=9


a = [ [1,2,3], [1,[1,2],3] ]
x = listlength(a)
print('length={}'.format(x))
#  1
#  2
#  3
#  1
#    1
#    2
#  3
#length=7
0
nagordon

これが私の実装です:

def nestedList(check):
    returnValue = 0
    for i in xrange(0, len(check)):
        if(isinstance(check[i], list)):
            returnValue += nestedList(check[i])
        else:
            returnValue += 1
    return returnValue
0