展开嵌套的序列-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

展开嵌套的序列

哦哦喔 2020-04-16 21:54:07 245

你想将一个多层嵌套的序列展开成一个单层列表

分享到
取消 提交回答
全部回答(1)
  • 哦哦喔
    2020-04-16 21:54:17
    可以写一个包含 yield from 语句的递归生成器来轻松解决这个问题。比如:
    
    from collections import Iterable
    
    def flatten(items, ignore_types=(str, bytes)):
        for x in items:
            if isinstance(x, Iterable) and not isinstance(x, ignore_types):
                yield from flatten(x)
            else:
                yield x
    
    items = [1, 2, [3, 4, [5, 6], 7], 8]
    # Produces 1 2 3 4 5 6 7 8
    for x in flatten(items):
        print(x)
    在上面代码中, isinstance(x, Iterable) 检查某个元素是否是可迭代的。 如果是的话, yield from 就会返回所有子例程的值。最终返回结果就是一个没有嵌套的简单序列了。
    
    额外的参数 ignore_types 和检测语句 isinstance(x, ignore_types) 用来将字符串和字节排除在可迭代对象外,防止将它们再展开成单个的字符。 这样的话字符串数组就能最终返回我们所期望的结果了。比如:
    
    >>> items = ['Dave', 'Paula', ['Thomas', 'Lewis']]
    >>> for x in flatten(items):
    ...     print(x)
    ...
    Dave
    Paula
    Thomas
    Lewis
    >>>
    
    0 0
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

推荐文章