写点什么

Python 代码阅读(第 35 篇):完全(深度)展开嵌套列表

用户头像
Felix
关注
发布于: 刚刚
Python代码阅读(第35篇):完全(深度)展开嵌套列表

Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码


本篇阅读的代码实现了将一个嵌套列表的所有嵌套层次完全展开,形成一个简单的列表的功能。

本篇阅读的代码片段来自于30-seconds-of-python

deep_flatten

from collections.abc import Iterable
def deep_flatten(lst): return [a for i in lst for a in deep_flatten(i)] if isinstance(lst, Iterable) else [lst]
# EXAMPLESdeep_flatten([1, [2], [[3], 4], 5]) # [1,2,3,4,5]
复制代码


deep_flatten函数接收一个嵌套列表,返回完全展开后的列表。函数使用isinstance()collections.abc.Iterable来检查一个元素是否可迭代(是否为list)。如果是,则在列表推导式内递归调用deep_flatten()函数,否则返回[lst]


原函数:


def deep_flatten(lst):   return [a for i in lst for a in deep_flatten(i)] if isinstance(lst, Iterable) else [lst]
复制代码


可以改写成:


def deep_flatten(lst):   if isinstance(lst, Iterable):    return [a for i in lst for a in deep_flatten(i)]  else:    return [lst]
复制代码


函数判断如果lst是可迭代对象的话,就执行return [a for i in lst for a in deep_flatten(i)]。这时如果i是可迭代对象,在deep_flatten(i)中就会继续调用该列表推导式,继续展开嵌套的列表;如果i不是可迭代对象,在在deep_flatten(i)中就会返回[i],此时a的值就是i,在列表推导式中就会得到一个非可迭代对象的元素,解开了元素上的嵌套层。


更近一步,函数可以改写成:


from collections.abc import Iterable
def deep_flatten(lst): temp = [] def f(lst): if isinstance(lst, Iterable): for i in lst: for a in f(i): temp.append(a) return [] else: return [lst] f(lst) return temp
print(deep_flatten([1, [2], [[3], 4], 5])) # [1,2,3,4,5]
复制代码


发布于: 刚刚阅读数: 2
用户头像

Felix

关注

没有看点,仅仅闲聊。欢迎关注“没看点” 2018.05.04 加入

欢迎关注个人公众号:没看点 个人主页:www.zhangfelix.com

评论

发布
暂无评论
Python代码阅读(第35篇):完全(深度)展开嵌套列表