不用isinstance类型检查,Python如何单行实现混合元素列表扁平化?
问题
现有如下结构的列表:
l = [0, 1,[2, 3], 4, 5, [6, 7], {1, 2}]
我目前可以通过如下代码完成扁平化操作:
from collections.abc import Iterable aux = [] for e in l: if not isinstance(e, Iterable): aux.append(e) else: aux.extend(e)
请问是否存在不使用类型检查的单行代码可以实现相同功能?
解答
你当前的代码实现的是仅展开一层嵌套可迭代对象的逻辑,不会递归处理更深层级的嵌套结构。要实现相同效果,同时避免显式类型检查的单行写法有两种可选:
- 用
__iter__属性判断替代Iterable实例检查,可读性更高:
aux = [item for elem in l for item in (elem if hasattr(elem, '__iter__') else [elem])]
- 完全不做任何前置属性/类型判断,采用EAFP(出错后处理)的思路,通过异常捕获兼容不可迭代元素,严格符合无类型检查的要求:
aux = []; [exec('try: aux.extend(e)\nexcept TypeError: aux.append(e)') for e in l]
两种写法的输出和原有代码完全一致,最终结果为[0, 1, 2, 3, 4, 5, 6, 7, 1, 2],注意末尾集合元素的顺序可能因Python版本不同存在差异。
内容的提问来源于stack exchange,提问作者user17189165
相关产品推荐
相关产品推荐

