递归展开嵌套列表等可迭代对象(list,dict,set...)

展开嵌套列表算法是一个常考点,既是基础,但是要写好也不简单,我见过很多个版本,老手和新手之间的差别简直堪比云泥。接下来分享一个高效又巧妙的版本,代码也很短。

今天在知乎同样看到了一下这段代码,是之前flattenlambda版本,可以说是把pythonic思想进一步升华了,实在是太优美啦。

flatten = lambda nested: list(filter(lambda _: _, 
                                     (lambda _: ((yield from flatten(e)) if isinstance(e, Iterable) else (yield e) for e in _))(nested)))

================= 2018.02.03 ========================

废话不多说直接上代码:

def flatten(obj, ignore_itmes=(str, bytes)):
    for item in obj:
        if isinstance(item, Iterable) and not isinstance(item, ignore_itmes):
            yield from flatten(item)
        else:
            yield item

使用yield构建生成器可以有很好的性能,ignore_items当中可以自定义不想被当做迭代对象的类型集合,最巧妙的点在于yield from递归调用自身这个生成器。

可以说是性能/空间的利用率都相当高,代码没几行但是充分体现了Python的精炼美。

你可能感兴趣的:(Python)