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 相关文章推荐
Tornado Web服务器多进程启动的2个方法
Aug 04 Python
Python多线程、异步+多进程爬虫实现代码
Feb 17 Python
python 时间戳与格式化时间的转化实现代码
Mar 23 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
Python+OpenCV采集本地摄像头的视频
Apr 25 Python
python程序 创建多线程过程详解
Sep 23 Python
Tensorflow 多线程设置方式
Feb 06 Python
Python如何执行精确的浮点数运算
Jul 31 Python
详解Python 3.10 中的新功能和变化
Apr 28 Python
python保存图片的四个常用方法
Feb 28 Python
对象析构函数__del__在Python中何时使用
Mar 22 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
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
PHP 解决session死锁的方法
2013/06/20 PHP
解析PHP 5.5 新特性
2013/07/02 PHP
什么情况下可以不写PHP的闭合标签“?>”
2014/08/28 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
javascript indexOf函数使用说明
2008/07/03 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
Python实现JSON反序列化类对象的示例
2018/01/31 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
python自动生成model文件过程详解
2019/11/02 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
牦牛毛户外探险服装:Kora
2019/02/08 全球购物
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
自荐信如何“自荐”
2013/10/24 职场文书
设计专业自荐信
2014/06/19 职场文书
敬业奉献模范事迹材料(2016精选版)
2016/02/26 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL