“混合双打”二维数组展平的有效方案(Python)
切片赋值简单直接,extend方法和“+”运算符直观简捷。
(笔记模板由python脚本于2025年01月01日 18:40:26创建,本篇笔记适合熟悉Python列表操作的coder翻阅)
-
Python官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
本文质量分:
本文地址: https://blog.csdn.net/m0_57158496/article/details/144870574
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆ 二维数组展
- 1、开篇辞
- 2、sum()
- 3、切片赋值
- 4、列表拼接
- 4.1 “+”运算符
- 4.2 list.extend方法
- 5、进阶
- 5.1 “定点”逆序置换
- 5.2 遍历
- 5.3 递归
- 6、知识点汇总
- 7、自信底气
◆ 二维数组展
1、开篇辞
在数据处理的竞技场上,二维数组如同层层叠叠的迷宫,等待着勇敢的程序员去探索和解构。一般地,为了满足特定的项目需求或简化数据处理流程,需要将二维数组“降维打击”展平成一维的线性世界。
接下来,我将与大家分享几种“混合双打”实用小技巧,它充分利用Python的灵活性与程序员编程的智慧,在面对混乱的二维数组时,能够游刃有余地展平。
请君轻移莲步,让我们一起揭开二维数组降维的神秘面纱,探索Python编程的无限可能,享受成功看到终端心仪输出的舒爽!🤗
前边的流言,是我分享sum、切片赋值、列表“+”运算、“定点自我替换”技巧的神配开篇。😋
2、sum()
help(sum)
sum在这里的用法,就是是巧用其start
参数,用[]
空列表替换基缺省的0
,这是充分拉差sum高效完成列表的“+”运算。😎
如想了解更多,请点击下面的链接跳转翻阅。
- 炫技:拼接列表、破碎二维数组——Python sum()函数隐藏技能花式玩法
地址:https://blog.csdn.net/m0_57158496/article/details/128125260
浏览阅读:874
收藏:3 评论:2
(本篇笔记于2022-12-01 01:15:49首次发布,最后修改于2022-12-09 12:33:41)
简单数组
nums = [1, [2, 3, 4], [5, 6], 7, 8, [9]]
lis = [item if isinstance(item, list) else [item] for item in nums] # 修正二维数组的全部元素为子列表,以适用sum魔术拉平
print(sum(lis, []))
效果截屏图片
一般数组
ids = (['140651356', '由bext安装“异常”引出的话题:windows上转义字符的工作原理', '由bext安装“ 异常”引出的话题:Windows上转义字符的工作原 理,与ai“闲扯”不经意学习知识点', ['2024-07-25 19:36:50', 2557, '']],
['128977545', '最大公约数:常用的四大算法求解最大公约数,分解质因数法、短除法、辗转相 除法、更相减损法。', '常用的四大算法求解最 大公约数,分解质因数法、短除法、辗转相除法 、更相减损法', ['2023-02-10 23:48:20', 2556, 1]])
lis = [item if isinstance(item, list) else [item] for item in ids[0]] # 修正二维数组的全部元素为子列表,以适用sum魔术拉平
print(sum(lis, []))
效果截屏图片
注意: sum()
的适用前提是,二维数组的全部元素必须是list
,不然会抛出异常提示。
原理: 操作过程实则是,sum函数遍历第一参数列表,依次将列表元素与start参数[]
相加后返回。
3、切片赋值
切片赋值您得清晰的明白,子列表的位置:
如
ids = (['140651356', '由bext安装“异常”引出的话题:windows上转义字符的工作原理', '由bext安装“ 异常”引出的话题:Windows上转义字符的工作原 理,与ai“闲扯”不经意学习知识点', ['2024-07-25 19:36:50', 2557, '']],
['128977545', '最大公约数:常用的四大算法求解最大公约数,分解质因数法、短除法、辗转相 除法、更相减损法。', '常用的四大算法求解最 大公约数,分解质因数法、短除法、辗转相除法 、更相减损法', ['2023-02-10 23:48:20', 2556, 1]])
lis = ids[1]
lis[3:3+1] = lis[3] # 用位置3子列表的所有元素替换上层列表索引3的位置(子列表原有位置)
print(lis)
效果截屏图片
如图所示,用位置3子列表的所有元素替换上层列表索引3的位置(子列表原有位置)
注意: 切片赋值,正如字面义,被赋值(等号左边)的一定是切片,哪怕是[2:2]
空切片,空切片相当于list.insert
方法。赋的值(等号右边)必须是序列(可迭代的)。
如:
lis = [1, 2, 3, 4, 5, 6]
lis[4:4] = '梦幻精灵_cq'
print(lis)
截屏图片
如想更多了解“切片赋值”请点击下面的链接跳转翻阅我的学习笔记。
- “切片赋值”创建列表批量操作“新”方法(Python)
地址:https://blog.csdn.net/m0_57158496/article/details/144293018
浏览阅读:836
点赞:25 收藏:11
(本篇笔记于2024-12-08 23:09:19首次发布,最后修改于2024-12-09 11:26:37)
4、列表拼接
Python中列表拼接有两种表现形式:一、+
运算符,直接把两个列表像int
一样相加lis + lis2
,解释器会给您拼接+
两端的列表。二、list.extend
方法,会把extend
方法的参数序列全部元素追加到列表。
4.1 “+”运算符
如:
nums = [1, [2, 3, 4], [5, 6], 7, 8, [9]]
nums = nums[0:1] + nums[1] + nums[2] + nums[3:5] + nums[5]
print(nums)
效果截屏图片
4.2 list.extend方法
如:
ids = (['140651356', '由bext安装“异常”引出的话题:windows上转义字符的工作原理', '由bext安装“ 异常”引出的话题:Windows上转义字符的工作原 理,与ai“闲扯”不经意学习知识点', ['2024-07-25 19:36:50', 2557, '']],
['128977545', '最大公约数:常用的四大算法求解最大公约数,分解质因数法、短除法、辗转相 除法、更相减损法。', '常用的四大算法求解最 大公约数,分解质因数法、短除法、辗转相除法 、更相减损法', ['2023-02-10 23:48:20', 2556, 1]])
ids[0][:-1].extend(ids[0][-1])
print(ids[0])
效果截屏图片
注意: +
运算符操作的两个对象都必须是list
和list.extend
方法必须是序列(可迭代对象)。“+”运算符是连接两个列表,list.extend
方法是将参数序列追加到列表。
如:
lis = [1, 2, 3, 4, 5, 6]
lis.extend('DreamElf_cq')
print(lis)
输出:
5、进阶
5.1 “定点”逆序置换
经过我的罗列,可以看到sum
虽然强大但要求“乖张”,必须二维数组的元素全为list
;而切片赋值就相对“轻松”,需“定点投放”。“定点”是有迹可寻的,isinstance
就是比较不错的工具。
如:
nums = [1, [2, 3, 4], [5, 6], 7, 8, [9]]
indexs = [k for k,item in enumerate(nums) if isinstance(item, list)] # 为子列表定点
# 遍历子列表位置 #
for i in indexs[::-1]:
nums[i:i+1] = nums[i] # 用子列表的所有元素为它所在的位置赋值,达成置换(展平)目的
print(nums)
效果截屏图片
细心的您,一定注意到,遍历的为什么是逆序副本indexs[::-1]
,这是在践行代码时得来的教训:如顺序拉平,逻辑上感觉不到异常,但当小序号的子列表展平,后面的子列表豆被往后“推移”,先前辛苦收集到的子列表索引的位置就会“腐败变质”,如同过期食品。😋
解决方案也极尽简单,转换一下思路就来了。逆序替换,是先展平尾部子列表,一级列表元素索引的“往后推移”,对我们之前找到的子列表索引位置,不造成任何影响。棘手问题迎刃而解。🤗
5.2 遍历
以下是我用“非捕获”列表解析式生成的“装逼单行”和“标准”习惯写法的代码示例,它们等质同效,都会输出相同“”拉平二维数组的结果。
示例代码
# 装逼单行
nums = [1, [2, 3], [4], [5, 6], 7, 8, [9]]
new_list = []
[new_list.extend(item) if isinstance(item, list) else new_list.append(item) for item in nums] # 循环单行模式
print(new_list) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 标准写法
nums = [1, [2, 3], [4], [5, 6], 7, 8, [9]]
new_list = []
for item in nums:
if isinstance(item, list):
new_list.extend(item)
else:
new_list.append(item)
print(new_list) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
两个代码块都会将nums
列表中的所有元素(无论它们是单个元素还是列表)扩展到new_list
中,并打印出最终的结果。虽然“装逼单行”模式看起来更简洁,但“标准写法”在可读性和可维护性方面通常更受欢迎。
注意: “非捕获”解析式一定不可惜用圆括号包裹,那样就成了手榴弹,没有拉弦不会引爆。
封装模式
def break_list(lis):
''' 展平二维数组 '''
new_list = []
for item in lis:
if isinstance(item, list):
new_list.extend(item)
else:
new_list.append(item)
return new_list
nums = [1, [2, 3], [4], [5, 6], 7, 8, [9]]
print(break_list(nums))
5.3 递归
递归形式结构代码,可以让重复单一操作的代码变得简单易于理解。
“开关”递归
def break_list(lis):
''' 递归展平维数组 '''
new_list = []
for item in lis:
if isinstance(item, list):
new_list.extend(item)
else:
new_list.append(item)
flag = [1 for item in new_list if isinstance(item, list)]
if flag:
print(66)
return break_list(new_list)
return new_list
nums = [1, [[[2], 3], 4], [[5], 6], 7, 8, [9]]
print(break_list(nums))
优化递归
def break_list(lis):
''' 递归展平多维数组 '''
new_list = []
for item in lis:
if isinstance(item, list):
new_list.extend(break_list(item)) # 递归展平子列表
else:
new_list.append(item)
return new_list
nums = [1, [[[2], 3], 4], [[5], 6], 7, 8, [9]]
print(break_list(nums)) # 输出应该是展平后的列表
注意: 递归适用,必有base算法和“机关”(跳出递归时机),二者缺一不可。
6、知识点汇总
截屏图片
以下是对提到的工具及其用途的简要说明:
-
sum:当需要展平一个二维数组时,使用
sum
结合生成器表达式是一种非常Pythonic且高效的方法。这种方法利用了sum
可以接受一个可迭代对象,并将其中的元素累加起来的特性,非常适合于这种场景。 -
list[:] = iter:这是一种原地修改列表的方法,通过将一个迭代器赋值给列表的切片,可以快速地替换列表中的元素,实现展平。这种方法效率高,因为它不需要额外的内存来创建新的列表。
-
list.extend 或 list +:这两个操作都可以用来拼接列表。
list.extend
方法会将另一个列表的元素添加到当前列表的末尾,而list +
操作会返回一个新的列表,它是两个列表的拼接结果。这两个方法在处理列表拼接时非常有用。 -
遍历、递归、枚举enumerate:这些是辅助工具,可以用来帮助实现展平操作。
- 遍历:通过循环直接访问每个元素,适合于简单的展平操作。
- 递归:当列表结构可能更深层次嵌套时,递归是一种自然的解决方案。
- 枚举enumerate:当需要同时访问元素及其索引时,
enumerate
非常有用。
每种工具都有其适用的场景,选择合适的工具可以使代码更加简洁、高效。您的选择体现了对Python工具和特性的深刻理解。😎
截屏图片
7、自信底气
自信,
也得有“努力筑基”打底。💪
对话截屏图片
上一篇: 远方的灯塔(自创诗歌浅析)(宠物龟努力爬行,惹出了一段远方的遐想)
下一篇:
我的HOT博:
本次共计收集404篇博文笔记信息,总阅读量61.76w。数据采集于2024年11月25日 08:23:38,用时7分56.4秒。阅读量不小于6.00k的有
9
9
9篇。
- 让QQ群昵称色变的神奇代码
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
浏览阅读:6.2w
点赞:25 收藏:89 评论:17
(本篇笔记于2022-01-18 19:15:08首次发布,最后修改于2022-01-20 07:56:47)
- Python列表(list)反序(降序)的7种实现方式
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
浏览阅读:1.3w
点赞:9 收藏:40 评论:8
(本篇笔记于2022-12-11 23:54:15首次发布,最后修改于2023-03-20 18:13:55)
- pandas 数据类型之 DataFrame
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
浏览阅读:1.0w
点赞:7 收藏:40
(本篇笔记于2022-05-01 13:20:17首次发布,最后修改于2022-05-08 08:46:13)
- 个人信息提取(字符串)
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
浏览阅读:1.0w
点赞:3 收藏:20
(本篇笔记于2022-04-18 11:07:12首次发布,最后修改于2022-04-20 13:17:54)
- 罗马数字转换器|罗马数字生成器
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
浏览阅读:8.2k
收藏:3
(本篇笔记于2022-01-19 23:26:42首次发布,最后修改于2022-01-21 18:37:46)
- 统计字符串字符出现的次数
地址:https://blog.csdn.net/m0_57158496/article/details/130517025
浏览阅读:8.1k
点赞:5 收藏:24
(本篇笔记于2023-05-06 22:28:18首次发布,最后修改于2023-05-12 06:21:40)
- Python字符串居中显示
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
浏览阅读:8.0k
点赞:1 收藏:12 评论:1
- 回车符、换行符和回车换行符
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
浏览阅读:6.7k
点赞:2 收藏:4
(本篇笔记于2022-02-24 13:10:02首次发布,最后修改于2022-02-25 20:07:40)
- python清屏
地址:https://blog.csdn.net/m0_57158496/article/details/120762101
浏览阅读:6.1k
点赞:1 收藏:10
截屏图片
(此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)