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 08 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
Python多进程原理与用法分析
Aug 21 Python
Python的iOS自动化打包实例代码
Nov 22 Python
Python Cookie 读取和保存方法
Dec 28 Python
Python txt文件加入字典并查询的方法
Jan 15 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
Python split() 函数拆分字符串将字符串转化为列的方法
Jul 16 Python
Python udp网络程序实现发送、接收数据功能示例
Dec 09 Python
Django多数据库配置及逆向生成model教程
Mar 28 Python
Python任务调度模块APScheduler使用
Apr 15 Python
Python使用socket去实现TCP客户端和TCP服务端
Apr 12 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合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
php常用表单验证类用法实例
2015/06/18 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
显示、隐藏密码
2006/07/01 Javascript
checkbox 复选框不能为空
2009/07/11 Javascript
JavaScript 函数式编程的原理
2009/10/16 Javascript
JS 实现完美include载入实现代码
2010/08/05 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
javascript最基本的函数汇总
2015/06/25 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
2019/04/19 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
Python随机生成彩票号码的方法
2015/03/05 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
Python统计单词出现的次数
2018/04/04 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
python 实现矩阵按对角线打印
2019/11/29 Python
空指针到底是什么
2012/08/07 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
工厂会计员职责
2014/02/06 职场文书
活动策划求职信模板
2014/04/21 职场文书
会计学专业求职信
2014/07/17 职场文书
财产保全担保书
2015/01/20 职场文书
Python 中random 库的详细使用
2021/06/03 Python