【发布时间】:2020-05-11 05:18:43
【问题描述】:
假设我有以下输入:
items = [1, 2, [3, 4], (5, 6), 'ciao', range(3), (i for i in range(3, 6))]
我想对items 执行一些递归操作。
为了简单起见,假设我想展平项(但也可以是其他任何东西),这样做的一种方法是:
def flatten(items, max_depth=-1, shallow=(str, bytes, bytearray)):
for item in items:
if shallow and isinstance(item, shallow) or max_depth == 0:
yield item
else:
try:
for subitem in flatten(item, max_depth - 1, shallow):
yield subitem
except TypeError:
yield item
这会产生:
print(list(flatten(items)))
[1, 2, 3, 4, 5, 6, 'ciao', 0, 1, 2, 3, 4, 5]
现在如何修改flatten() 以便生成以下内容(对于任意嵌套级别)?
print(list(flatten(items, shallow=None)))
[1, 2, 3, 4, 5, 6, 'c', 'i', 'a', 'o', 0, 1, 2, 3, 4, 5]
要支持的其他输入:
items = [['best', 'func'], 'ever']
print(list(flatten(items, shallow=None)))
# ['b', 'e', 's', 't', 'f', 'u', 'n', 'c', 'e', 'v', 'e', 'r']
注意:我正在寻找一种不依赖于显式检查 str、bytes 或 bytearray 的方法,因为这非常脆弱,如果它出现另一种具有迭代它产生的属性的类型物品本身。
【问题讨论】:
-
这就是为什么没有一个独特的
char类型是一种痛苦。 -
其实,这不是唯一的问题。考虑如何将
a展平,其中a = [1]; a.append(a)。 -
一般来说,你不知道迭代一个项目是否会产生项目本身。找出答案的唯一方法是实际迭代它。
-
为什么要将字节和字节数组声明为浅层?他们没有 str 的问题,是吗?
-
@HeapOverflow
shallow参数用于指定如果可以迭代,则不应针对哪些类型进行递归。
标签: python recursion generator