割り当てに実際の問題(および頭痛)があります...
私は入門的なプログラミングクラスに参加しており、リストを指定すると、「最大」の深さを返す関数を作成する必要があります...例:[1,2,3]は1、[ 1、[2,3]]は2を返します。
私はこのコードを書きました(T_Tを取得できる最高のものです)
def flat(l):
count=0
for item in l:
if isinstance(item,list):
count+= flat(item)
return count+1
ただし、最大の深さを考慮しないリストがある場合でも、カウンターが上がるため、明らかに正常に機能しません...
例:[1,2、[3,4]、5、[6]、7]で関数を使用すると、2が返されますが、3が返されます。
どんなアイデアや助けも大歓迎です^^どうもありがとう!私はこれに何週間も苦労してきました...
幅優先、再帰なし、他のシーケンスタイプでも機能します。
from collections import Sequence
from itertools import chain, count
def depth(seq):
for level in count():
if not seq:
return level
seq = list(chain.from_iterable(s for s in seq if isinstance(s, Sequence)))
同じ考えですが、メモリ消費量がはるかに少なくなります。
from collections import Sequence
from itertools import chain, count
def depth(seq):
seq = iter(seq)
try:
for level in count():
seq = chain([next(seq)], seq)
seq = chain.from_iterable(s for s in seq if isinstance(s, Sequence))
except StopIteration:
return level
これが関数を書く1つの方法です
_depth = lambda L: isinstance(L, list) and max(map(depth, L))+1
_
私はあなたが欠けている考えはmax()
を使うことだと思います
まず、要件を少し言い換えてみましょう。
リストの深さは、そのサブリストの最大深さより1つ多くなります。
これで、これを直接コードに変換できます。
def depth(l):
if isinstance(l, list):
return 1 + max(depth(item) for item in l)
else:
return 0
再帰で簡単
def flat(l):
depths = []
for item in l:
if isinstance(item, list):
depths.append(flat(item))
if len(depths) > 0:
return 1 + max(depths)
return 1
虐待的な方法:あなたのリストがmylist
と呼ばれているとしましょうmybrackets = map(lambda x: 1 if x=='[' else -1, [x for x in str(mylist) if x=='[' or x==']'])
maxdepth = max([sum(mybrackets[:i+1]) for i in range(len(mybrackets))])
これにより、リストが開始ブラケットと終了ブラケットのリストに変換され、対応する終了ブラケットが発生する前に発生する開始ブラケットの最大数が検出されます。
追加のモジュールを必要とせず、深さに関係なく同じ速度を持つ方法:
_def depth(nested):
instring = False
count = 0
depthlist = []
for char in repr(nested):
if char == '"' or char == "'":
instring = not instring
Elif not instring and ( char == "[" or char == ")" ):
count += 1
Elif not instring and ( char == "]" or char == ")" ):
count -= 1
depthlist.append(count)
return(max(depthlist))
_
基本的に、これはrepr()
を使用してリストを文字列に変換します。次に、「_(
_」または「_[
_」に等しいこの文字列内のすべての文字について、変数count
が増加します。閉じ括弧の場合、count
が減少します。次に、count
が到達した最大値を返します。
python :)の1行でそれをしました
楽しい
def f(g,count=0): return count if not isinstance(g,list) else max([f(x,count+1) for x in g])
ハンマーの答え すべての反復可能(デフォルトで文字列が無効になっている)に対して拡張しました:
def depth(arg, exclude=None):
if exclude is None:
exclude = (str, )
if isinstance(arg, Tuple(exclude)):
return 0
try:
if next(iter(arg)) is arg: # avoid infinite loops
return 1
except TypeError:
return 0
try:
depths_in = map(lambda x: depth(x, exclude), arg.values())
except AttributeError:
try:
depths_in = map(lambda x: depth(x, exclude), arg)
except TypeError:
return 0
try:
depth_in = max(depths_in)
except ValueError:
depth_in = 0
return 1 + depth_in
@Johnのソリューションは優れていますが、_[]
_、_[[]]
_のような空のリストの場合に対処するには、次のようなことを行う必要があります。
depth = lambda L: isinstance(L, list) and (max(map(depth, L)) + 1) if L else 1
空のリストも処理できるように、言われたことへの短い追加:
def list_depth(list_of_lists):
if isinstance(list_of_lists, list):
if(len(list_of_lists) == 0):
depth = 1
else:
depth = 1 + max([list_depth(l) for l in list_of_lists])
else:
depth = 0
return depth
Numpyでは、データ構造を_numpy array
_に変換し、そのライブラリ関数を使用できます。 _arr.shape
_はレイヤーごとの長さを与えるので、形状をlen()
して、構造の深さを取得できます。
_import numpy as np
def f( lists )
arr = np.array( lists )
return len(arr.shape)
f( [[[1,2],[3,4]],[[3,4],[5,6]]] ) # results in 3
f( [[1,2],[3,4]] ) # results in 2
f( [1,2] ) # results in 1
f( [] ) # results in 1
_
形状のNumpyドキュメント: https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.shape.html