小书匠python

使用Python脚本的过程中,偶尔需要使用list多层转一层,又总是忘记怎么写搜索关键词,所以总是找了很久,现在把各种方法记录下来,方便自己也方便大家.

方法很多,现在就简单写8种,后面再对这8种方法做基准测试.

声明:文中的方法均收集自Making a flat list out of list of lists in Python


1.定义减层方法

  1. import functools 

  2. import itertools 

  3. import numpy 

  4. import operator 

  5. import perfplot 

  6. from collections import Iterable # or from collections.abc import Iterable 

  7. from iteration_utilities import deepflatten 


  8. #使用两次for循环 

  9. def forfor(a): 

  10. return [item for sublist in a for item in sublist] 


  11. #通过sum 

  12. def sum_brackets(a): 

  13. return sum(a, []) 


  14. #使用functools內建模块 

  15. def functools_reduce(a): 

  16. return functools.reduce(operator.concat, a) 


  17. #使用itertools內建模块 

  18. def itertools_chain(a): 

  19. return list(itertools.chain.from_iterable(a)) 


  20. #使用numpy 

  21. def numpy_flat(a): 

  22. return list(numpy.array(a).flat) 


  23. #使用numpy 

  24. def numpy_concatenate(a): 

  25. return list(numpy.concatenate(a)) 


  26. #自定义函数 

  27. def flatten(items): 

  28. """Yield items from any nested iterable; see REF.""" 

  29. for x in items: 

  30. if isinstance(x, Iterable) and not isinstance(x, (str, bytes)): 

  31. yield from flatten(x) 

  32. else: 

  33. yield x 


  34. def pylangs_flatten(a): 

  35. return list(flatten(a)) 


  36. #使用库iteration_utilities 

  37. def iteration_utilities_deepflatten(a): 

  38. return list(deepflatten(a, depth=1)) 

2.测试

  1. a=[[1,2,3],[4,5,6],[7,8,9]] 

  2. print(a) 


  3. print('--------------------------') 


  4. print(forfor(a)) 

  5. print(sum_brackets(a)) 

  6. print(functools_reduce(a)) 

  7. print(itertools_chain(a)) 

  8. print(numpy_flat(a)) 

  9. print(numpy_concatenate(a)) 

  10. print(pylangs_flatten(a)) 

  11. 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.各种方法的基准测试(消耗时间对比)

各种方法在小数据上消耗时间差别不大,如果数据很小,没必要为了选择而烦恼,如果数据很大,可以参考下面基准测试的结果来选择减层方法.

  1. import matplotlib.pyplot as plt 

  2. from simple_benchmark import benchmark 


  3. #基准测试 

  4. b = benchmark( 

  5. [forfor, sum_brackets, functools_reduce, itertools_chain,numpy_flat, numpy_concatenate, pylangs_flatten,iteration_utilities_deepflatten], 

  6. arguments={2**i: [[0]*5]*(2**i) for i in range(1, 13)}, 

  7. argument_name='number of inner lists' 




  8. #显示测试结果 

  9. plt.subplots(1,1,figsize=(15,10)) 

  10. b.plot() 

  11. plt.legend(loc = 'upper left') 

  12. plt.show() 


消耗时间对比

相同数据量,纵轴方向越小,方法越快.


代码可以从这里下载,需要部署Jupyter环境,可参考我的博客部署方法.

Python中多层List展平为一层的更多相关文章

  1. python中多层循环的一键退出

    在单层循环的退出中,使用break即能退出,那么多层循环呢?机智的人们使用flag标识符的方式,例如: a=['a',1,2,3,4] b=['b',1,2,3,4] c=['c',1,2,3,4] ...

  2. ZBrush中Flatten展平笔刷介绍

    本文我们来介绍ZBrush®中的Flatten展平笔刷,Flatten笔刷能增加粗糙的平面在模型表面,利用它能够制作出完全的平面. Flatten展平笔刷 Flatten(展平):Flatten笔刷可 ...

  3. Python中的列表生成式和多层表达式

    Python中的列表生成式和多层表达式 如何生成[1x1, 2x2, 3x3, ..., 10x10]的列表? L=[]; ,): L.append(x*x) print L print (" ...

  4. python中sys和os模块的使用

    在python中,sys,os模块是非常强大的,提供了许多对文件夹.文件和路径的操作方法 sys模块 sys.argv   #命令行执行脚本,其实它就是一个列表 ,sys.argv[0] 是程序自身路 ...

  5. Python中命名空间与作用域使用总结

    1 引言 命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug.Python的命名空间与作用域与Java.C++等语言有很大差异,若不注意,就可能出现莫 ...

  6. Python中赋值、浅拷贝与深拷贝

    python中关于对象复制有三种类型的使用方式,赋值.浅拷贝与深拷贝.他们既有区别又有联系,刚好最近碰到这一类的问题,研究下. 一.赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不 ...

  7. python中的函数名,闭包,迭代器

    一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...

  8. (数据科学学习手札101)funcy:Python中的函数式编程百宝箱

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在使用Python完成日常任务时,经常会遇到 ...

  9. Python中关于进度条的6个实用技巧

    1 简介 费老师我在几年前写过的一篇文章(https://www.cnblogs.com/feffery/p/13392024.html)中,介绍过tqdm这个在当下Python圈子中已然非常流行的进 ...

随机推荐

  1. Java Service Wrapper将jar包安装成Windows服务

    刚接触java,第一次使用Java开发windows服务,也是刚不久看了SSM框架 简直也是一头雾水,不过只要用心理解,其实很简单,下面有详细的步骤,包学包会 在windows上运行jar包,需要在工 ...

  2. JSP 9大隐式对象和四个作用域的范围

    Java中 九大隐式对象说明 输入/输出对象:  request   response   out 作用域通信对象: session  application  pageContext Servlet ...

  3. ASP.NET EF实体主外键关系

    其他解释 https://www.cnblogs.com/wuhenke/archive/2010/08/11/1797307.html 主键.外键 需要删除完外键表才能删除主键表 一对一关系peop ...

  4. 记支付宝接口对接,涉及到提取证书SN号的解决方案

    支付宝针对.NET SDK并未封装有提取证书SN序列号的方法,仅针对Java平台才有对应的方法(赤裸裸的歧视啊~~) 要想在提取这个SN序列号有两种方案: 1. 直接用Java SDK包来提取SN 2 ...

  5. live555的使用(转载)

    Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现 了对多种音视频编码格式的音视频数据的流 ...

  6. jenkens 安装是git版本过低 升级

    Jenkins本机默认使用"yum install -y git" 安装的git版本比较低,应该自行安装更高版本的git. 查看jenkins本机的git版本 1 2 [root@ ...

  7. python(if判断)

    一.if判断 如果 条件满足,才能做某件事情, 如果 条件不满足,就做另外一件事情,或者什么也不做 注意: 代码的缩进为一个 tab 键,或者 4 个空格 在 Python 开发中,Tab 和空格不要 ...

  8. p5.BTC-网络

    Bitcoin工作在应用层,网络层是P2P . Bitcoin网络通信的设计原则是 simple  robust ,but not efficient. 每个节点维护一个邻居节点的集合,消息传播采取 ...

  9. Windows通过SSH远程登录Linux主机

    准备工作:1.Windows系统下装有VMware虚拟机且是Linux系统2.终端连接工具Xshell 63.本次实验系统IP如下 系统 IP Windows10 192.168.37.111 Cen ...

  10. Windows下学习C语言有哪些集成开发软件?

    前言 初学者学习C语言遇到的最大困难想必就是搭建环境了,相当多的初学者就是被搭建环境导致放弃了学习编程,就我自己的经验而言,初学编程不应该受限于环境,使用成熟好用的环境就可以了,之后熟悉一些可以在慢慢 ...