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将文本中的中英文分离方法
Oct 31 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
python远程邮件控制电脑升级版
May 23 Python
解决.ui文件生成的.py文件运行不出现界面的方法
Jun 19 Python
Python 实现遥感影像波段组合的示例代码
Aug 04 Python
FFrpc python客户端lib使用解析
Aug 24 Python
python 基于dlib库的人脸检测的实现
Nov 08 Python
Python 求数组局部最大值的实例
Nov 26 Python
python3.7添加dlib模块的方法
Jul 01 Python
浅谈matplotlib默认字体设置探索
Feb 03 Python
pycharm部署django项目到云服务器的详细流程
Jun 29 Python
Python基本的内置数据类型及使用方法
Apr 13 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自动注册登录验证机制实现代码
2011/12/20 PHP
学习php分页代码实例
2013/10/24 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP实现负载均衡session共享redis缓存操作示例
2018/08/22 PHP
用JQuery调用Session的实现代码
2010/10/29 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
使用TensorFlow实现SVM
2018/09/06 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
超级实用的8个Python列表技巧
2020/08/24 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
农业大学毕业生的个人自我评价
2013/10/11 职场文书
难忘的一天教学反思
2014/04/30 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
小学家长学校培训材料
2014/08/24 职场文书
社团招新宣传语
2015/07/13 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server