変数_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
_
これが数字だけでなく文字列でも機能するかどうかを確認します。
この関数は、リストの長さをカウントし、リスト以外のオブジェクトを長さ1としてカウントし、リストアイテムを再帰的に平坦化された長さを見つけます。インタープリターの最大スタック深度まで、任意のネストで機能します。
def recursive_len(item):
if type(item) == list:
return sum(recursive_len(subitem) for subitem in item)
else:
return 1
注:これがどのように使用されるかによっては、タプルのサイズなどを正しく判断するために、型がlist
であるかどうかをチェックするよりも、アイテムが反復可能かどうかをチェックする方が良い場合があります。ただし、オブジェクトが反復可能かどうかを確認すると、文字列の長さに1を与えるのではなく、文字列内の各文字をカウントするという副作用が生じ、望ましくない場合があります。
別の方法として、flattenをlenとともに使用できます。
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の置き換え
ハッキングソリューション、誰かがそれを投稿する必要がありました。リストを文字列に変換し(重い処理/再帰を__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))
_
あなたは本質的に、木の葉の数を計算する方法を探しています。
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つある木です。葉の数は木の長さ、つまり枝の数とは異なります。
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))))
これは再帰を利用した私の最善の試みであり、標準ライブラリとビジュアルのみを使用します。カスタムライブラリを使用しないようにします
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
これが私の実装です:
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