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 回答