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使用PyGame绘制图像并保存为图片文件的方法
Apr 24 Python
利用python程序生成word和PDF文档的方法
Feb 14 Python
python机器学习理论与实战(一)K近邻法
Jan 28 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
在CMD命令行中运行python脚本的方法
May 12 Python
使用Python检测文章抄袭及去重算法原理解析
Jun 14 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
python实现超市管理系统(后台管理)
Oct 25 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
python解析命令行参数的三种方法详解
Nov 29 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
Jan 13 Python
Python调用飞书发送消息的示例
Nov 10 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
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
Tensorflow简单验证码识别应用
2017/05/25 Python
python scipy卷积运算的实现方法
2019/09/16 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
2020/08/11 Python
英国航空官网:British Airways
2016/09/11 全球购物
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
职工运动会邀请函
2014/01/19 职场文书
安全承诺书范文
2014/03/26 职场文书
公安学专业求职信
2014/07/27 职场文书
学校政风行风整改方案
2014/10/25 职场文书
新教师个人总结
2015/02/06 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
怎样写好工作计划
2019/04/10 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技
vue3获取当前路由地址
2022/02/18 Vue.js