当前位置: 首页 > article >正文

“混合双打”二维数组展平的有效方案(Python)

切片赋值简单直接,extend方法和“+”运算符直观简捷。


(笔记模板由python脚本于2025年01月01日 18:40:26创建,本篇笔记适合熟悉Python列表操作的coder翻阅)


【学习的细节是欢悦的历程】

  • Python官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
    地址:https://lqpybook.readthedocs.io/



  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


---== 虚位以待 ==---


---== 虚位以待 ==---

等风来,不如追风去……


切片赋值简单直接
二维数组展
(extend方法和“+”运算符直观简捷)


本文质量分:

95 95 95

本文地址: 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高效完成列表的“+”运算。😎

    如想了解更多,请点击下面的链接跳转翻阅。
  1. 炫技:拼接列表、破碎二维数组——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) 

  • 截屏图片
    在这里插入图片描述

  如想更多了解“切片赋值”请点击下面的链接跳转翻阅我的学习笔记。

  1. “切片赋值”创建列表批量操作“新”方法(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])

  • 效果截屏图片
    在这里插入图片描述

注意: +运算符操作的两个对象都必须是listlist.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、知识点汇总


  • 截屏图片
    在这里插入图片描述

以下是对提到的工具及其用途的简要说明:

  1. sum:当需要展平一个二维数组时,使用 sum 结合生成器表达式是一种非常Pythonic且高效的方法。这种方法利用了 sum 可以接受一个可迭代对象,并将其中的元素累加起来的特性,非常适合于这种场景。

  2. list[:] = iter:这是一种原地修改列表的方法,通过将一个迭代器赋值给列表的切片,可以快速地替换列表中的元素,实现展平。这种方法效率高,因为它不需要额外的内存来创建新的列表。

  3. list.extend 或 list +:这两个操作都可以用来拼接列表。list.extend 方法会将另一个列表的元素添加到当前列表的末尾,而 list + 操作会返回一个新的列表,它是两个列表的拼接结果。这两个方法在处理列表拼接时非常有用。

  4. 遍历、递归、枚举enumerate:这些是辅助工具,可以用来帮助实现展平操作。

    • 遍历:通过循环直接访问每个元素,适合于简单的展平操作。
    • 递归:当列表结构可能更深层次嵌套时,递归是一种自然的解决方案。
    • 枚举enumerate:当需要同时访问元素及其索引时,enumerate 非常有用。

  每种工具都有其适用的场景,选择合适的工具可以使代码更加简洁、高效。您的选择体现了对Python工具和特性的深刻理解。😎


  • 截屏图片
    在这里插入图片描述



回页目录


7、自信底气


  自信,
  也得有“努力筑基”打底。💪


  • 对话截屏图片
    在这里插入图片描述



回页首


上一篇:  远方的灯塔(自创诗歌浅析)(宠物龟努力爬行,惹出了一段远方的遐想)
下一篇: 



我的HOT博:

  本次共计收集404篇博文笔记信息,总阅读量61.76w。数据采集于2024年11月25日 08:23:38,用时7分56.4秒。阅读量不小于6.00k的有 9 9 9篇。

  1. 让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)

  2. 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)

  3. 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)

  4. 个人信息提取(字符串)
    地址: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)

  5. 罗马数字转换器|罗马数字生成器
    地址:https://blog.csdn.net/m0_57158496/article/details/122592047
    浏览阅读:8.2k
    收藏:3 
    (本篇笔记于2022-01-19 23:26:42首次发布,最后修改于2022-01-21 18:37:46)

  6. 统计字符串字符出现的次数
    地址: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)

  7. Python字符串居中显示
    地址:https://blog.csdn.net/m0_57158496/article/details/122163023
    浏览阅读:8.0k
    点赞:1 收藏:12 评论:1
  8. 回车符、换行符和回车换行符
    地址: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)

  9. python清屏
    地址:https://blog.csdn.net/m0_57158496/article/details/120762101
    浏览阅读:6.1k
    点赞:1 收藏:10 

推荐条件 阅读量突破6.00k
(更多热博,请点击蓝色文字跳转翻阅)

  • 截屏图片
    在这里插入图片描述
      (此文涉及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规范(说明文档的规范写法)


http://www.kler.cn/a/464176.html

相关文章:

  • 【工具整理】WIN换MAC机器使用工具整理
  • Unity2022接入Google广告与支付SDK、导出工程到Android Studio使用JDK17进行打包完整流程与过程中的相关错误及处理经验总结
  • 设计模式 创建型 原型模式(Prototype Pattern)与 常见技术框架应用 解析
  • 【GO基础学习】gin的使用
  • overleaf写学术论文常用语法+注意事项+审阅修订
  • AWS K8s 部署架构
  • 【SqlSugar雪花ID常见问题】.NET开源ORM框架 SqlSugar 系列
  • requests请求带cookie
  • 深入理解Java Map集合
  • 逻辑回归(Logistic Regression)深度解析
  • 在Swagger(现称为OpenAPI)中各类@api之间的区别
  • k8s系列--docker拉取镜像导入k8s的containerd中
  • HTML——56.表单发送
  • 从零开始学桶排序:Java 示例与优化建议
  • 2025.01.02 一月 | 充分地接受生活本身
  • python中常用的内置函数介绍
  • Java开发工具-Jar命令
  • 面试经典问题 —— 链表之返回倒数第k个节点(经典的双指针问题)
  • RK3568适配美格(MEIG-SLM3XX)4G模块
  • JavaWeb开发(五)Servlet-ServletContext
  • 大数据-266 实时数仓 - Canal 对接 Kafka 客户端测试
  • 数字图像总复习
  • ubuntu切换到root用户
  • 【C++动态规划】2088. 统计农场中肥沃金字塔的数目|2104
  • C++11右值与列表初始化
  • Redis数据库主要数据结构类型