Python展开列表

本文记录了在学习30-seconds-of-python-code时遇到的列表展开问题,分享了使用递归列表推导和yield实现展开的方法,并邀请大神们分享更多高效方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值