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 不同对象比较大小示例探讨
Aug 21 Python
Python编程中的文件读写及相关的文件对象方法讲解
Jan 19 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
在python中将list分段并保存为array类型的方法
Jul 15 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
基于多进程中APScheduler重复运行的解决方法
Jul 22 Python
爬虫代理池Python3WebSpider源代码测试过程解析
Dec 20 Python
python实现文字版扫雷
Apr 24 Python
完美解决ARIMA模型中plot_acf画不出图的问题
Jun 04 Python
Python类的继承super相关原理解析
Oct 22 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
opencv 分类白天与夜景视频的方法
Jun 05 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
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
jQuery中调用WebService方法小结
2011/03/28 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
2016/09/24 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
js实现select下拉框选择
2020/01/11 Javascript
[00:16]热血竞技场
2019/03/06 DOTA
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
Python解惑之True和False详解
2017/04/24 Python
Python内存读写操作示例
2018/07/18 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
耐克亚太地区:Nike APAC
2019/12/07 全球购物
如何提高JDBC的性能
2013/04/30 面试题
公司委托书格式
2014/08/01 职场文书
2014年便民服务中心工作总结
2014/12/20 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
焦裕禄观后感
2015/06/03 职场文书