コードを次のように変更する簡単な方法をお見せしましょう: (### はコードに追加した新しい行なので、そこで何が起こっているかを見ることができます)
def depth(L) :
nesting = []
for c in L:
if type(c) == type(nesting) :
print 'nesting before append', nesting ###
nesting.append(depth(c))
print 'nesting after append', nesting ###
if len(nesting) > 0:
return 1 + max(nesting)
return 1
次に、深さが 3 のリストを作成します。
l=[[1,2,3],[1,2,[4]],'asdfg']
リストに 3 つの要素があることがわかります。1 つはリスト、もう 1 つはそれ自体に別のリストを持つリストで、最後の 1 つは文字列です。このリストの深さが 3 であることは明らかです (つまり、メイン リストの 2 番目の要素にネストされた 2 つのリストがあります)。
このコードを実行してみましょう:
>>> depth(l)
nesting before append []
nesting after append [1]
nesting before append [1]
nesting before append []
nesting after append [1]
nesting after append [1, 2]
3
簡単です!この関数は、ネストに 1 を追加します。次に、要素に別のリストもある場合は、関数自体が呼び出された回数である 1 + ネストの最大数を追加します。要素が文字列の場合はスキップします。
最後に、再帰が発生した最大回数であるネストの最大数を返します。これは、メインリストのリスト内にリストが存在する回数、つまり深さです。この場合、予想どおり、2 番目の要素 + 1=3 に対して再帰が 2 回発生しました。
それでも取得に問題がある場合は、関数にさらにステートメントまたは他の変数を追加してprint
、それらを注意深く観察してみてください。最終的には取得できます。