Python-嵌套列表变成普通列表
如何把[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嵌套列表知多少
今天在创建嵌套列表时遇到一个问题,决定看看到底是谁在背后捣鬼 >>> board1 = [[0]*3 for _ in range(3)] [[0, 0, 0], [0, 0, 0] ...
- python【第二篇】列表、元组、字典及文件操作
本节内容 列表 元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作:列表有序.可变.元素 ...
- Python学习笔记6(列表生成式)
1.生成列表 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我们可以用range(1, 11): >>> range(1, 11) [1, 2, 3 ...
- Python学习笔记 (3) :列表、元组的操作
列表,即写在方括号之间.用逗号分隔开的数值列表.列表内的项目不必全是相同的类型. >>> a = ['spam', 'eggs', 100, 1234] >>> a ...
- Python笔记·第五章—— 列表(List) 的增删改查及其他方法
一.列表的简介 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:li = ...
- python之三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...
- Python中高级变量类型(列表,元组,字典,字符串,公共方法...)
高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) ...
- Day2 Python基础学习——字符串、列表、元组、字典、集合
Python中文学习大本营:http://www.pythondoc.com/ 一.字符串操作 一.用途:名字,性格,地址 name = 'wzs' #name = str('wzs')print(i ...
- Python 入门(十)列表生成式
生成列表 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我们可以用range(1, 11): >>> range(1, 11) [1, 2, 3, ...
- python协程函数应用 列表生成式 生成器表达式
协程函数应用 列表生成式 生成器表达式 一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...
随机推荐
- CSS3实现圆环进度条
摘要:圆环进度条被应用于各个场景,比如我们可以用来表示加载进度等.通常我们可以用 css3 的动画去实现. 详解 css3 实现圆环进度条 简单的画一个圆环,我们都知道如何使用 css 画一个圆环.( ...
- CF1271C Shawarma Tent 题解
通过分析样例可以发现,离学校越近的地点经过的路线也会越多,因此我们只要考虑学校周围的八个点即可.而且可以发现,对于一个点,路线会经过这个点的节点是确定的.因此在输入的时候可以统计学校周围八个节点被经过 ...
- 网站SEO优化技术转让奇人
http://www.wocaoseo.com/thread-111-1-1.html 本月假期我排到了今天星期二,由于工作性质原因经常会熬夜,养成一种不好的习惯"睡懒觉"视为享受 ...
- python+opencv 打开网络摄像头
python+opencv 打开网络摄像头(手机)(转) #以下是最常用的读取视频流的方法import cv2url = 'rtsp://admin:admin@192.169.5.2:554/'#根 ...
- Blazor带我重玩前端(五)
概述 本文主要讨论Blazor事件内容,由于blazor事件部分很多,所以会分成上下两篇,本文为第一篇,后续会有第二篇. 我们可以视组件是一个类,我们先看一下前文所说的Index.Razor页面生成的 ...
- e3mall商城的归纳总结7之solr搭建和应用
敬给读者的话 本文主要应用的技术是solr技术的搭建和应用,本文小编尽量写的更详细一些,让读者在不考虑项目的情况下也能正常完成solr的搭建,说完搭建之后,再说明运行solrj在项目中如何应用solr ...
- python爬取酷我音乐(收费也可)
第一次创作,请多指教 环境:Python3.8,开发工具:Pycharm 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的 ...
- VSCode优雅编码
安装eslint 修改eslint配置 rules: { 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', ...
- 深圳做假证h
深圳做假证[电/薇:187ヘ1184ヘ0909同号]办各类证件-办毕业证-办离婚证,办学位证书,办硕士毕业证,办理文凭学历,办资格证,办房产证不. 这是一个简单的取最大值程序,可以用于处理 i32 数 ...
- 安装和配置SQL
安装和配置SQL 在终端输入 npm i mysql命令安装SQL(加上-g全局安装) 配置SQL // 1.导入mysql模块 const mysql = require("mysql&q ...