0

リストとタプルを平坦化する小さな機能があります。再帰呼び出しは呼び出されますが、何も起こりません..「何も起こらない」とは、stderrメッセージが出力されず、結果も得られないことを意味します。その振る舞いは意味をなさないので、ポインタは高く評価されます。どうも!

def flatten(*arr):
  sys.stderr.write("STDERR: arr is %s\n" %list(arr))
  for a in arr:
    if type(a) is list or type(a) is tuple:
      flatten(a)
    else:
      yield a

print list(flatten(['hi there','how are you'],'well there','what?',[1, 23423,33]))
4

1 に答える 1

2

あなたの機能にはいくつかの問題があります。

まず、isinstance()シーケンスのテストを単純化するために使用します。

for a in arr:
    if isinstance(a, (list, tuple)):

再帰flatten()呼び出しをループして要素を呼び出し元に渡し、リストを個別の引数として渡す必要があります (*構文を使用して、関数のシグネチャをミラーリングします)。

for sub in flatten(*a):
    yield sub

これらの変更により、ジェネレーターは次のように動作します。

>>> def flatten(*arr):
...     for a in arr:
...         if isinstance(a, (list, tuple)):
...             for sub in flatten(*a):
...                 yield sub
...         else:
...              yield a
... 
>>> print list(flatten(['hi there','how are you'],'well there','what?',[1, 23423,33]))
['hi there', 'how are you', 'well there', 'what?', 1, 23423, 33]
于 2013-06-07T22:02:54.330 に答える