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的Django框架中用流响应生成CSV文件的教程
May 02 Python
Python实现文件复制删除
Apr 19 Python
浅谈python迭代器
Nov 08 Python
Python实现检测文件MD5值的方法示例
Apr 11 Python
python中pip的安装与使用教程
Aug 10 Python
值得收藏的10道python 面试题
Apr 15 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
wxPython实现画图板
Aug 27 Python
利用PyTorch实现VGG16教程
Jun 24 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
Mar 02 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
人大复印资料处理程序_查询篇
2006/10/09 PHP
生成静态页面的PHP类
2006/11/25 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
简述vue-cli中chainWebpack的使用方法
2019/07/30 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
[46:32]Fnatic vs OG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python读取txt某几列绘图的方法
2018/10/14 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
python读写配置文件操作示例
2019/07/03 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
python代码实现猜拳小游戏
2020/11/30 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
HTML5 embed 标签使用方法介绍
2013/08/13 HTML / CSS
简单介绍HTML5中audio标签的使用
2015/09/24 HTML / CSS
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
毕业生找工作自荐书
2014/06/30 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
新郎结婚感言
2015/07/31 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书