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内置数据类型详解
Aug 18 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
python 把文件中的每一行以数组的元素放入数组中的方法
Apr 29 Python
Python3中的json模块使用详解
May 05 Python
详解Python Matplot中文显示完美解决方案
Mar 07 Python
OpenCV 边缘检测
Jul 10 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
python模块如何查看
Jun 16 Python
Python Tornado核心及相关原理详解
Jun 24 Python
解决python打开https出现certificate verify failed的问题
Sep 03 Python
Django前后端分离csrf token获取方式
Dec 25 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
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
vue 使用html2canvas将DOM转化为图片的方法
2018/09/11 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
python中将字典转换成其json字符串
2014/07/16 Python
Python常用内置函数总结
2015/02/08 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
Python线程指南分享
2019/11/19 Python
马来西亚户外装备商店:PTT Outdoor
2019/07/13 全球购物
中专生自荐信
2013/10/12 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
《游戏公平》教学反思
2016/02/20 职场文书