python如何把嵌套列表转变成普通列表


Posted in Python onMarch 20, 2018

如何把[1, 5, 6, [2, 7, [3, [4, 5, 6]]]]变成[1, 5, 6, 2, 7, 3, 4, 5, 6]?

思考:

-- for循环每次都遍历列表一层

-- 把取出的单个值加入到新的列表中

-- 把取出来的嵌套列表变成新的遍历列表,就需要在for循环外嵌套一个while循环

-- 当取到最里面的列表嵌套时候,对最后一个值进行处理

#!/usr/bin/python3
 
__author__ = 'beimenchuixue'
__blog__ = 'http://www.cnblogs.com/2bjiujiu/'
 
 
def change_l(raw_l):
  """这个函数处理列表比较特殊,必须满足每层列表中最后一个值为嵌套列表"""
  median_l = raw_l                # 中间列表
  new_l = []                   # 结果列表
  count = 0                    # 循环计数统计循环次数和列表长度比较的值
  while True:
    try:
      for value in median_l:         # 每次for循环取出一个值
        count += 1
        if count < len(median_l):      # 如果计算小于列表长度,说明没有取出最后的嵌套列表
          new_l.append(value)
        elif count == len(median_l):    # 当计数长度等于列表长度,取出二层嵌套列表
          median_l = value        # 每次指向每一层最后的嵌套列表
          count = 0            # 计算清零
    except Exception as e:           # 打印异常
      print(e)
       
    try:
      len(median_l)              # 每次尝试对每层最后一个值进行取长,不是列表报错,并把最后一个值添加到结果列表
    except TypeError:
      new_l.append(median_l)
      break                  # 最后一个值添加进去,循环结束
  return new_l
 
 
if __name__ == '__main__':
  raw_l = [1, 5, 6, [2, 7, 7, [3, [4, 5, 6]]]]  # 定义一个初始嵌套列表
   
  new_l = change_l(raw_l=raw_l)
  print('change_l:', new_l)

没有解决一个问题:

-- 这个问题本身很特殊,有点递归嵌套,无法解决一层有2个以上的嵌套列表、

如何解决  ['a', 'b', 1, ['c', [2, 'd'], 3, 4, 5, ['e', 6, 'f', 'E'], 7], 8] 变成普通列表?

#!/usr/bin/python3
 
__author__ = 'beimenchuixue'
__blog__ = 'http://www.cnblogs.com/2bjiujiu/'
 
 
def change_l(raw_l):
  """这个可以应对各种嵌套类型列表,都可以把多维列表一维化"""
  new_l = []                   # 初始结果列表
  median_l = []                  # 循环接收取出来的嵌套列表,一个中间列表
  while True:
    for value in raw_l:
      try:
        if len(value):           # 判断取出是否是整数,是整数触发异常,嵌套列表和字符串都有长度
          try:
            if value.isalnum():     # 判断取出是数字或字母,不是数字或字母触发异常
              new_l.append(value)   # 是数字或字母添加到list_a中去
          except Exception as e:     # 触发不是数字或字母异常
            print(e)
            median_l.extend(value)   # 把取出的嵌套列表添加到 median_l 中
            raw_l = median_l      # 循环raw_l 指向 median_l 中间列表
            print(raw_l)
      except Exception as e:         # 触发整数len()方法异常
        print(e)
        new_l.append(value)         # 是整数添加到new_l中去
         
    # 判断取到最后的嵌套列表中是否还有嵌套列表
    count = 0
    for value in median_l:           # 循环二层嵌套列表
      try:                  # 尝试判断最后一层嵌套列表是否嵌套,如果嵌套,异常次数就会少于列表长度
        len(value)             # 整数触发异常
        value.isalnum()           # 不是 数字或字母类型字符串触发异常
      except Exception as e:
        print(e)
        count += 1             # 每出现一次异常,异常次数加1
    if count == len(median_l):         # 判断异常次数是否等于最后循环列表长度,如果等于,就确认已经循环了最后一层列表,退出整个循环
      break
    median_l = []                # 置空中间列表,接收下一层嵌套列表
  return new_l
 
if __name__ == '__main__':
  raw_l = ['a', 'b', 1, ['c', [2, 'd'], 3, 4, 5, ['e', 6, 'f', 'E'], 7], 8, 'g'] # 初始普通嵌套列表
  # 结果
  new_l = change_l(raw_l)
  print(new_l)

逻辑整理:

1. 本质上通过for循环特性,for循环只能遍历一层

2. 通过遍历,把取出来的单个值进行判断,把符合要求的加入到新的列表中,把不符合的添加到中间列表中

最大问题:如何进行最后的循环的判断?

我的想法是:

a. 通过最后中间列表的遍历,判断是否还有嵌套列表,通过异常次数和列表长度比较,

b. 如果中间列表等于异常次数,说明循环到了最后的列表,退出整个循环

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python运算符重载用法实例
May 28 Python
Python selenium如何设置等待时间
Sep 15 Python
python实现简单爬虫功能的示例
Oct 24 Python
Python 操作文件的基本方法总结
Aug 10 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
python图像常规操作
Nov 11 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python如何生成各种随机分布图
Aug 27 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 Python
Pygame Time时间控制的具体使用详解
Nov 17 Python
Python内置函数reversed()用法分析
Mar 20 #Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 #Python
python如何拆分含有多种分隔符的字符串
Mar 20 #Python
Python中str.join()简单用法示例
Mar 20 #Python
单利模式及python实现方式详解
Mar 20 #Python
python如何去除字符串中不想要的字符
Jul 05 #Python
python删除某个字符
Mar 19 #Python
You might like
无线电广播的开始
2002/01/30 无线电
模拟xcopy的函数
2006/10/09 PHP
php面向对象的方法重载两种版本比较
2008/09/08 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
2016/07/14 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
简单实现jQuery轮播效果
2017/08/18 jQuery
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
jQuery实现简单全选框
2020/09/13 jQuery
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
python创建文件备份的脚本
2018/09/11 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
python处理excel绘制雷达图
2019/10/18 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
HTML5教程之html 5 本地数据库(Web Sql Database)
2014/04/03 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
中国制造网:Made-in-China.com
2019/10/25 全球购物
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
物业管理专业个人的自我评价
2013/11/19 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
英文导游词
2015/02/13 职场文书
会议主持人开场白台词
2015/05/28 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
详解CocosCreator项目结构机制
2021/04/14 Javascript