1

这是一个功能

def flatten(nested):
   try:
        for sublist in nested:
            for element in flatten(sublist):
                yield element
   except TypeError:
       yield nested

nested=[[1, 2], [3, 4], [5]]

我想了解的是当第一次调用函数 flatten 时将整个序列([[1, 2], [3, 4], [5]])传递给它,以下是我理解的执行顺序

 flatten([[1, 2], [3, 4], [5]]):
   try:
        for sublist in ([[1, 2], [3, 4], [5]]):
            for element in flatten(sublist):

这里调用了 flatten 并从嵌套 [0] 的列表元素 [1,2] 开始

现在在这个展平的递归调用中,它按照以下方式进行

 flatten([1, 2]):
   try:
        for sublist in ([1, 2]):
            for element in flatten(sublist):

但在最后一种情况下 [5] 发生了什么

  for sublist in ([5]):
                for element in flatten(sublist):

现在在递归调用中,flatten 是如何工作的?我也不清楚,如果输入不是一个定义明确的列表,输入是下面的列表[[[1],2],3,4,[5,[6,7]],8]

那么递归调用是如何发生的,我不清楚这件事。

4

4 回答 4

1

在第 4 行,再次调用 flatten。当到达一个元素时,会触发类型错误,并产生它。

否则再次调用 flatten 。

于 2013-06-07T12:17:19.837 回答
1
def flatten(nested, depth=0):
    print "-> %d : %s" % (depth, nested)
    try:
        for sublist in nested:
            print " s %d : %s" % (depth, sublist)
            for element in flatten(sublist, depth+1):
                print " e %d : %s" % (depth, element)
                yield element
    except TypeError:
        print " y %d : %s" % (depth, nested)
        yield nested

您可以准确地追踪它是如何与上述内容一起工作的......

于 2013-06-07T12:15:06.353 回答
0

我不是 python 人,但在我看来,这个 faltten 是这样工作的:

  1. 它将递归地尝试为每个元素调用自身,直到发生 TypeError

  2. 当 TypeError 发生时,这意味着该元素不是一个集合,并且无法进一步展平,因此它将产生该元素。

示例flatten [[[1],2],3,4,[5,[6,7]],8]::

1st call 1st step: sublist = [[1],2]
2nd call 1st step: sublist = [1]
3nd call 1st step: type error | yield : [1]
2nd call 2nd step: type error | yield : [1,2]
1st call 2nd step: type error | yield : [1,2,3]

.... 等等。

于 2013-06-07T12:12:31.573 回答
0

您始终可以添加日志记录以了解何时执行某些方法以及使用哪些参数:

def flatten(nested):
    print(nested)
    try:
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested

调用顺序如下:

[[[1], 2], 3, 4, [5, [6, 7]], 8]
[[1], 2]
[1]
1
2
3
4
[5, [6, 7]]
5
[6, 7]
6
7
8
于 2013-06-07T12:15:01.177 回答