Python展开列表

最近看30-seconds-of-python-code, 发现一个展开列表的例子, 想了很久, 在这里记录一下心得(PS: 代码均在Python3.6上测试)。
首先我想到的是递归列表推导,然后代码写出来是这样子的

def flatten(arr):
    if isinstance(arr, list):
        return [a for i in arr for a in flatten(i)]
    else:
        return [arr]

然后看了GitHub的代码, 在这里粘贴出来

def spread(arg):
    ret = []
    for i in arg:
        if isinstance(i, list):
            ret.extend(i)
        else:
            ret.append(i)
    return ret


def deep_flatten(arr):
    result = []
    result.extend(
        spread(list(map(lambda x: deep_flatten(x) if type(x) == list else x, arr))))
    return result

然后想到了yield, 便开始思考能否用它来写

def flatten(arr):
    for a in arr:
        if isinstance(a, list):
            yield from flatten(a)
        else:
            yield a
# 这里用到了Python3中的yield from.
# Python2可以这样写, 实际上是一样的

def flatten(arr):
    for a in arr:
        if isinstance(a, list):
            for sub in flateen(a):
                yield sub
        else:
            yield a

大神们有好的方案, 欢迎留言.

发布了26 篇原创文章 · 获赞 41 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/anonymous_qsh/article/details/79404093