Python中多层List展平为一层
使用Python脚本的过程中,偶尔需要使用list多层转一层,又总是忘记怎么写搜索关键词,所以总是找了很久,现在把各种方法记录下来,方便自己也方便大家.
方法很多,现在就简单写8种,后面再对这8种方法做基准测试.
声明:文中的方法均收集自Making a flat list out of list of lists in Python
1.定义减层方法
- import functools
- import itertools
- import numpy
- import operator
- import perfplot
- from collections import Iterable # or from collections.abc import Iterable
- from iteration_utilities import deepflatten
- #使用两次for循环
- def forfor(a):
- return [item for sublist in a for item in sublist]
- #通过sum
- def sum_brackets(a):
- return sum(a, [])
- #使用functools內建模块
- def functools_reduce(a):
- return functools.reduce(operator.concat, a)
- #使用itertools內建模块
- def itertools_chain(a):
- return list(itertools.chain.from_iterable(a))
- #使用numpy
- def numpy_flat(a):
- return list(numpy.array(a).flat)
- #使用numpy
- def numpy_concatenate(a):
- return list(numpy.concatenate(a))
- #自定义函数
- def flatten(items):
- """Yield items from any nested iterable; see REF."""
- for x in items:
- if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
- yield from flatten(x)
- else:
- yield x
- def pylangs_flatten(a):
- return list(flatten(a))
- #使用库iteration_utilities
- def iteration_utilities_deepflatten(a):
- return list(deepflatten(a, depth=1))
2.测试
- a=[[1,2,3],[4,5,6],[7,8,9]]
- print(a)
- print('--------------------------')
- print(forfor(a))
- print(sum_brackets(a))
- print(functools_reduce(a))
- print(itertools_chain(a))
- print(numpy_flat(a))
- print(numpy_concatenate(a))
- print(pylangs_flatten(a))
- print(iteration_utilities_deepflatten(a))
输出:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
--------------------------
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
2.各种方法的基准测试(消耗时间对比)
各种方法在小数据上消耗时间差别不大,如果数据很小,没必要为了选择而烦恼,如果数据很大,可以参考下面基准测试的结果来选择减层方法.
- import matplotlib.pyplot as plt
- from simple_benchmark import benchmark
- #基准测试
- b = benchmark(
- [forfor, sum_brackets, functools_reduce, itertools_chain,numpy_flat, numpy_concatenate, pylangs_flatten,iteration_utilities_deepflatten],
- arguments={2**i: [[0]*5]*(2**i) for i in range(1, 13)},
- argument_name='number of inner lists'
- )
- #显示测试结果
- plt.subplots(1,1,figsize=(15,10))
- b.plot()
- plt.legend(loc = 'upper left')
- plt.show()

相同数据量,纵轴方向越小,方法越快.
代码可以从这里下载,需要部署Jupyter环境,可参考我的博客部署方法.
Python中多层List展平为一层的更多相关文章
- python中多层循环的一键退出
在单层循环的退出中,使用break即能退出,那么多层循环呢?机智的人们使用flag标识符的方式,例如: a=['a',1,2,3,4] b=['b',1,2,3,4] c=['c',1,2,3,4] ...
- ZBrush中Flatten展平笔刷介绍
本文我们来介绍ZBrush®中的Flatten展平笔刷,Flatten笔刷能增加粗糙的平面在模型表面,利用它能够制作出完全的平面. Flatten展平笔刷 Flatten(展平):Flatten笔刷可 ...
- Python中的列表生成式和多层表达式
Python中的列表生成式和多层表达式 如何生成[1x1, 2x2, 3x3, ..., 10x10]的列表? L=[]; ,): L.append(x*x) print L print (" ...
- python中sys和os模块的使用
在python中,sys,os模块是非常强大的,提供了许多对文件夹.文件和路径的操作方法 sys模块 sys.argv #命令行执行脚本,其实它就是一个列表 ,sys.argv[0] 是程序自身路 ...
- Python中命名空间与作用域使用总结
1 引言 命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug.Python的命名空间与作用域与Java.C++等语言有很大差异,若不注意,就可能出现莫 ...
- Python中赋值、浅拷贝与深拷贝
python中关于对象复制有三种类型的使用方式,赋值.浅拷贝与深拷贝.他们既有区别又有联系,刚好最近碰到这一类的问题,研究下. 一.赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不 ...
- python中的函数名,闭包,迭代器
一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...
- (数据科学学习手札101)funcy:Python中的函数式编程百宝箱
本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在使用Python完成日常任务时,经常会遇到 ...
- Python中关于进度条的6个实用技巧
1 简介 费老师我在几年前写过的一篇文章(https://www.cnblogs.com/feffery/p/13392024.html)中,介绍过tqdm这个在当下Python圈子中已然非常流行的进 ...
随机推荐
- harbor helm仓库使用
harbor helm仓库使用 官方文档地址:https://github.com/goharbor/harbor Monocular 从1.0 开始专注于helm 的UI展示,对于部署以及维护已经去 ...
- Java JDK1.8源码学习之路 2 String
写在最前 String 作为我们最常使用的一个Java类,注意,它是一个引用类型,不是基本类型,并且是一个不可变对象,一旦定义 不再改变 经常会定义一段代码: String temp = " ...
- HBuilder 方便局域网访问调试
同一个局域网,通过IP不能访问我本地的项目,各种测试发现原来是防火墙的问题: 这里附上参考文档:内置web服务器被防火墙禁用导致预览和运行异常的解决方案
- System.AccessViolationException处理
程序出现 System.AccessViolationException异常会终止进程,try catch是无法捕捉的. 有个处理方法在引发异常的发放上面加上 [System.Runtime.Exce ...
- ActiveX的AssemblyInof.cs文件 IObjectSafety 接口
ActiveX的AssemblyInof.cs文件 IObjectSafety 接口 [Guid("D4176A17-2A33-4903-8F37-9EBDD7CAFFD3"), ...
- Java中关于Math的几个取整方法的区别
1.Math.ceil() 向上取整 System.out.println(Math.ceil(3.4)); //输出4 System.out.println(Math.ceil(3.7)); / ...
- jmeter进行压测的步骤
1)安装jmeter和Badboy. 2)用badboy录制脚本,保存之后直接导出. 3)用jmeter打开badboy录制的脚本,假如是有参数的话,需要写一个csv的参数化文件,在jmeter中添加 ...
- oracle 中查询当前用户可以看到的表名、表对应的所有字段 原
转自:https://my.oschina.net/u/3783799/blog/2870207 1.oracle 查询当前用户下的表名,表注释 select t.table_name, f.comm ...
- SetCurrentCellAddressCore 函数的可重入调用
绑定数据在线程中 private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (Di ...
- IIS-This configuration section cannot be used at this path.
Q:在IIS上部署web后,游览器打开报以下异常: This configuration section cannot be used at this path. This happens when ...