PYTHON压平嵌套列表的简单实现


Posted in Python onJune 08, 2016

list 是 Python 中使用最频繁的数据类型, 标准库里面有丰富的函数可以使用。

不过,如果把多维列表转换成一维列表(不知道这种需求多不多),还真不容易找到好用的函数,

要知道Ruby、Mathematica、Groovy中可是有flatten的啊。

如果列表是维度少的、规则的,还算好办

例如:

li=[[1,2],[3,4],[5,6]]
print [j for i in li for j in i]
#or
from itertools import chain
print list(chain(*li))
#or
a=[[1,2],[3,4],[5,6]]
t=[]
[t.extend(i) for i in a]
print t
#or
print sum(li,[])

对于复杂一些的,如:li=[1,[2],[[3]],[[4,[5],6]]],上面的方法就不好使了,得换个方法了,
从结构上看像是树状的,很容易联想到了目录的遍历,于是就有了下面的做法:

def flat(tree):
  res = []
  for i in tree:
    if isinstance(i, list):
      res.extend(flat(i))
    else:
      res.append(i)
  return res

另一种思路,嵌套列表无非就是有很多成对的方括号,一维的列表只有一对,把中间的去掉就行了,转换为字符串就好办了

def flatten(seq):
  s=str(seq).replace('[', '').replace(']', '') #当然也可以用正则
  return [eval(x) for x in s.split(',') if x.strip()]

不过,这种做法对于列表中出现包含"["或"]"的字符串时就无能为力了,需要改进.

其他方法:

国外某论坛上见到的,同样是递归,一行搞定

flat=lambda L: sum(map(flat,L),[]) if isinstance(L,list) else [L]

下面这个方法用到Tkinter模块,在邮件列表看到的方法。估计很多同学还不知道它能办到吧,也算是python自带。注意,windows版的python都自带Tkinter模块的,linux默认则没有

from Tkinter import _flatten

li=reduce(lambda *x:list(x),range(2,6),[1])
print li
print _flatten(li)
#Out:
#[[[[[1], 2], 3], 4], 5]
#(1, 2, 3, 4, 5)
#对元组同样适用

还有一些第三方模块提供这样的功能,如sympy、numpy、pipe等

对于嵌套的元组,无需多说了吧,只需稍加改动就可以了

以上这篇PYTHON压平嵌套列表的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中非常实用的一些功能和函数分享
Feb 14 Python
Hadoop中的Python框架的使用指南
Apr 22 Python
Python中if __name__ == '__main__'作用解析
Jun 29 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
Nov 30 Python
Windows下安装Scrapy
Oct 17 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
python根据url地址下载小文件的实例
Dec 18 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
python通过opencv实现图片裁剪原理解析
Jan 19 Python
python super用法及原理详解
Jan 20 Python
Python 的 f-string 可以连接字符串与数字的原因解析
Feb 20 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 #Python
浅谈Python数据类型之间的转换
Jun 08 #Python
浅谈python 四种数值类型(int,long,float,complex)
Jun 08 #Python
Python while 循环使用的简单实例
Jun 08 #Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
Jun 07 #Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 #Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 #Python
You might like
用PHP连mysql和oracle数据库性能比较
2006/10/09 PHP
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
PHP工厂模式的日常使用
2019/03/20 PHP
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
JavaScript仿支付宝6位数字密码输入框
2016/12/29 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
Vue路由模块化配置的完整步骤
2019/08/14 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
一些常用的Python爬虫技巧汇总
2016/09/28 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
Python的互斥锁与信号量详解
2019/09/12 Python
python序列化与数据持久化实例详解
2019/12/20 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
教师工作表现自我评价
2015/03/05 职场文书