我是一名编程新手,在理解我的 Python 教科书(Magnus Lie Hetland 的“Python 入门”)中的示例时遇到了一些困难。该示例适用于设计用于展平嵌套列表元素(具有任意深度)的递归生成器:
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
然后您将按如下方式输入嵌套列表:
>>> list(flatten([[[1],2],3,4,[5,[6,7]],8]))
[1,2,3,4,5,6,7,8]
我理解 flatten() 中的递归如何帮助缩减到此列表的最内层元素“1”,但我不明白的是当“1”实际传递回 flatten() 时会发生什么作为“嵌套”。我认为这会导致 TypeError(无法迭代数字),并且异常处理实际上会为生成输出做繁重的工作......但是使用修改后的 flatten() 版本进行测试让我信服事实并非如此。相反,似乎是“yield element”行负责。
即是说,我的问题是……如何实际执行“让步元素”?看起来“嵌套”要么是一个列表——在这种情况下添加了另一层递归——要么它是一个数字,你会得到一个 TypeError。
任何对此的帮助将不胜感激......特别是,我很乐意在 flatten() 处理一个简单示例时完成事件链,例如:
list(flatten([[1,2],3]))
最佳答案
我在函数中添加了一些工具:
def flatten(nested, depth=0):
try:
print("{}Iterate on {}".format(' '*depth, nested))
for sublist in nested:
for element in flatten(sublist, depth+1):
print("{}got back {}".format(' '*depth, element))
yield element
except TypeError:
print('{}not iterable - return {}'.format(' '*depth, nested))
yield nested
正在打电话
list(flatten([[1,2],3]))
展示
Iterate on [[1, 2], 3]
Iterate on [1, 2]
Iterate on 1
not iterable - return 1
got back 1
got back 1
Iterate on 2
not iterable - return 2
got back 2
got back 2
Iterate on 3
not iterable - return 3
got back 3
关于python - 用于展平嵌套列表的递归生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11377208/