zoukankan      html  css  js  c++  java
  • python 展开嵌套列表

    python 展开嵌套列表

    引言

    Python中的列表还可以将不同数据类型的项放在一个列表中。所以,一个嵌套的列表就是是一个包含多个列表的列表,例如[1,2,[3],[4,[5,6]]。

    通常,我们需要将这些嵌套列表转换为平面列表(flatted a nested list),以便对数据执行常规列表操作。

    方法1,创建递归函数

    首先介绍,python中对一个嵌套的list,和一个空列表[],进行sum()函数运算时,可以实现展开列表。

    >>> list_1 = [[1,2],[3]]
    >>> sum(list_1, [])
    [1, 2, 3]
    

    于是,结合递归原理,可以创建展平嵌套列表的函数如下:

    def flatten(li):
        return sum(([x] if not isinstance(x, list) else flatten(x) for x in li), [])
    
    >>> list_1 = [1, 2, [3], [4, [5, 6]]]
    >>> print(flatten(list_1))
    [1, 2, 3, 4, 5, 6]
    

    方法2,使用列表推导式

    >>> li = [[14], [215, 383, 87], [298], [374], [2, 3, 4, 5, 6, 7]]
    >>> flat_list = [item for sublist in li for item in sublist]
    >>> print(flat_list)
    [14, 215, 383, 87, 298, 374, 2, 3, 4, 5, 6, 7]
    

    注意,对于嵌套的列表使用列表推导式时,两个遍历变量的写法要写正确,可以先按照逻辑写推导式中遍历的部分,比如,对于上面的推导式,首先按照逻辑,写遍历的部分是, for sublist in li ;然后继续按照逻辑往下写下一层遍历, for item in sublist。最后,按照逻辑知道,遍历到sublist中的item 就是最后要推导出来的新列表的元素,所以就在列表推导式的最前面加上item。最终组成了完整的嵌套列表的列表推导式。

    还要注意的是,这种使用列表推导式展平列表的方法,要求必须是严格嵌套列表,也就是说列表中的每个元素都是列表,而没有非列表的元素,比如下例就会报错:

    >>> li = [14, [215, 383, 87], [298], [374], [2, 3, 4, 5, 6, 7]]
    >>> flat_list = [item for sublist in li for item in sublist]
    Traceback (most recent call last):
      File "<pyshell#77>", line 1, in <module>
        flat_list = [item for sublist in li for item in sublist]
      File "<pyshell#77>", line 1, in <listcomp>
        flat_list = [item for sublist in li for item in sublist]
    TypeError: 'int' object is not iterable
    

    这个时候,第一个方法是可以正常工作的。

    >>> flatten(li)
    [14, 215, 383, 87, 298, 374, 2, 3, 4, 5, 6, 7]
    

    其他的方法

    其他的方法有,Flatten List using Inbuilt reduce Function ,Flatten List Using NumPy,请参考Convert Nested List To A Flat List In Python

  • 相关阅读:
    HDFS镜像文件的解析与反解析
    HDFS镜像文件的解析与反解析
    Nginx将通过IP访问重定向
    Nginx反向代理导致PHP获取不到正确的HTTP_HOST,SERVER_NAME,客户端IP的解决方法
    PHP个人常用函数封装
    apache禁止公网IP访问的配置
    Linux查看端口被哪个进程占用
    Nginx负载均衡配置
    Nginx反向代理配置文件
    Apache多端口配置
  • 原文地址:https://www.cnblogs.com/songbiao/p/12689708.html
Copyright © 2011-2022 走看看