【问题标题】:Control recursion on nested lists / strings (without checking for the type)控制嵌套列表/字符串的递归(不检查类型)
【发布时间】: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']

注意:我正在寻找一种不依赖于显式检查 strbytesbytearray 的方法,因为这非常脆弱,如果它出现另一种具有迭代它产生的属性的类型物品本身。

这与以下内容有关:Control recursion on nested lists / strings

【问题讨论】:

  • 这就是为什么没有一个独特的char 类型是一种痛苦。
  • 其实,这不是唯一的问题。考虑如何将a 展平,其中a = [1]; a.append(a)
  • 一般来说,你不知道迭代一个项目是否会产生项目本身。找出答案的唯一方法是实际迭代它。
  • 为什么要将字节和字节数组声明为浅层?他们没有 str 的问题,是吗?
  • @HeapOverflow shallow 参数用于指定如果可以迭代,则不应针对哪些类型进行递归。

标签: python recursion generator


【解决方案1】:

如果你改变了

        if shallow and isinstance(item, shallow) or max_depth == 0:

        if shallow and isinstance(item, shallow) or max_depth == 0 or item == items:

然后它得到所有三个例子。

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2021-07-07
    • 2016-02-08
    • 2020-02-12
    相关资源
    最近更新 更多