压平列表

碾平列表是个很好玩的函数。比如你有个嗷嗷恶心的列表:

[[1, 2], [3, [4], [5, 6], 7], 8]

你想把它变成正常一点的

[1, 2, 3, 4, 5, 6, 7, 8]

要怎么办呢?

老实说,很久不接触这种东西,我已经早忘了当初是怎么写的了,憋了半天没写出来,后来参考了 http://www.cnblogs.com/c-hy/archive/2012/09/21/2696703.html 才回忆起来。

然后,着重介绍三种方法:

1、使用sum和map,感觉玩的比较炫,大家来感受一下:

from collections import Iterable

def flatten(x):
    if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
        return sum(map(flatten, x), [])
    else:
        return [x]

lst = [1, 2, [3, [4], [5, 6], 7], 8]
print(flatten(lst))

刚才那个网页中说,国外某论坛的大神写了一个匿名函数

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

基本上是一个意思的。

2、使用yield。这个是在《Python Cookbook》中介绍的一种方法

from collections import Iterable

def flatten(items, ignore_types=(str, bytes)):
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, ignore_types):
            yield from flatten(x)
        else:
            yield x

items = [[1, 2], [3, [4], [5, 6], 7], 8]
# Produces 1 2 3 4 5 6 7 8
for x in flatten(items):
    print(x)

yield from 比较巧妙。不过,这里有个限制,yield from是python3才有的,如果是在python2中使用,需要这么写:

from collections import Iterable

def flatten(items, ignore_types=(str, bytes)):
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, ignore_types):
            for i in flatten(x):
                yield i
        else:
            yield x

items = [[1, 2], [3, [4], [5, 6], 7], 8]
# Produces 1 2 3 4 5 6 7 8
for x in flatten(items):
    print(x)

2和3通用。不得不说yield真是个好东西。

3、Tkinter自带函数_flatten。不说话,直接上代码

from Tkinter import _flatten
lst = [1, 2, [3, [4], [5, 6], 7], 8]
print(_flatten(lst))

这个就比较可怕了。不过Tkinter这东西,据说只有windows才有,linux没有。mac不太清楚。

当然,其他方法也是有的,比如

def flatten(x):
    for i in x:
        if isinstance(i, Iterable) and not isinstance(i, (str, bytes)):
            flatten(i)
        else:
            new_lst.append(i)

new_lst = []
lst = [1, 2, [3, [4], [5, 6], 7], 8]
flatten(lst)
print(new_lst)

(感谢群友提供)思路比较简单,代码也很清晰,只是全局列表到底还是感觉有一点点耍赖。

当然,要说耍赖,这里还有更耍赖的,比如

lst = [1, 2, [3, [4], [5, 6], 7], 8]
print(list("[" + str(lst).replace("[", "").replace("]", "") + "]"))

还有

import re
lst = [1, 2, [3, [4], [5, 6], 7], 8]
print map(int, re.findall(‘\d+‘, str(lst)))

哈哈,很特定的环境下可以使用,比如第一个列表元素中不能含有"["和"]",第二个更是只能包含整数。不过,同学们的脑洞还是比较大的。

记录一下,留着玩。

时间: 07-05

压平列表的相关文章

PYTHON压平嵌套列表

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(cha

【html】无序列表、超链接

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

Android-------ListView列表中获取EditText输入的值

最近项目的购物车中用列表中包含了留言功能, 需要获取EditText输入的内容,当购买多件商品时,就有点棘手了. 经过查资料解决了这个功能,并写了一个案例: 效果图: 可以在商品数据用一个字段来管理留言数据,这样就可以方便的操作了. 代码: public class MainActivity extends AppCompatActivity { ListView listView; @Override protected void onCreate(Bundle savedInstanceSt

C#开发微信门户及应用(4)--关注用户列表及详细信息管理

在上个月的对C#开发微信门户及应用做了介绍,写过了几篇的随笔进行分享,由于时间关系,间隔了一段时间没有继续写这个系列的博客了,并不是对这个方面停止了研究,而是继续深入探索这方面的技术,为了更好的应用起来,专心做好底层的技术开发. 微信的很重要的一个特点就是能够利用其平台庞大的用户群体,因此很容易整合在CRM(客户关系管理)系统里面,服务号和订阅好都能够向关注者推送相关的产品消息,还能和48小时内响应消息和事件的活跃用户进行交互对话,因此用户信息是微信API里面非常重要的一环,本随笔主要介绍获取关

[js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理,由主板,电源,内存条,显卡, 机箱,显示器,外设等组成的 把一个成型的产品组成部件,分成一个个独立的部件,这种方式可以做出很多灵活的产品,这就是组合模式的优势 比如:家用台式机电脑,要求配置比较低, 这个时候只需要主板+电源+内存条+机箱+显示器+外设就可以了,不需要配置独立显卡 鸡腿堡+鸡翅+紫薯

python--以1-31的数字作为结尾的列表?论英文好的重要性!

一.python基础教程第2板(修订版)[代码清单2-1]中有一段要求打印'以1-31的数字作为结尾的列表' 截取代码示例:endings =['st','nd','rd'] +17*['th'] + ['st','nd','rd'] +7*['th'] +['st'] 运行结果:print(endings) ['st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th

mac中如何创建文件列表清单介绍详情

相信很多苹果电脑用户们一定都在困惑mac系统到底如何创建列表清单呢?其实方法还是比较简单的,想了解吗?有兴趣不妨来mac中如何创建文件列表清单介绍中仔细瞧瞧哦,相信它可以给你使用mac系统带来有效的帮助哦,还是先来mac中如何创建文件列表清单介绍中看看再说吧.mac中如何创建文件列表清单介绍: 1. 打开Finder定位到要生成文件清单的文件夹,将文件按照想要的方式排序,例如:创建时间 2. 直接全选(Command+A)所有文件,然后复制(Command+C)它们. 3. 接下来打开文本编辑器

Python作业本——第4章 列表

课后习题: 1.[]是一个空列表 2. 1 spam.insert(3, 'hello') 错,应为:spam[2] = 'hello' 3.['d']    'd' 4.['d']    'd' 5.['a', 'b'] 6.1 7.[3.14, 'cat', 11, 'cat', True, 99] 8.[3.14, 11, 'cat', True] 9.连接+,复制* 10.inset()方法可以指定位置插入 11.del 和remove()方法 12. 13.列表可以修改,元祖不能修改

列表,元组操作

定义列表 #!/usr/bin/env python # -*- coding:utf-8 -*- names = ["user1","user2","user3","user4"] 通过下标访问列表中的元素,下标从0开始计数 print(names[2]) #通过下标访问列表中的元素>>user3print(names[-1]) #取列表最后一位>>user4 切片:取多个元素 print(names