简 介: 很多情况下需要对于多维数组进行扁平化,当然可以借助于 numpy 中的 flat 来进行,但直接使用Python的 list 标准操作可以简化程序。但这需要对与其中多重循环的含义有所了解。

关键词Python列表扁平化多重循环

01将list变得扁平


1.背景

很多情况下需要将多维的list,tuple变的扁平(一维),以方便进行访问处理。比如下面将表格中的所有数字累加在一起。

这是一个二维的数组,需要在将相应的字符串进行分割之后,再将前面的汉字(即:非数字字符串 a.isdigit()来判断)去除,最后形成数组。

表格1:各个分赛区各组别国赛队伍数量

赛区 普通四轮 双车接力 直立节能 声音信标 AI电磁
东北 3 3 3 4 3
华北 5 4 4 5 6
华东 8 9 10 9 9
华南 9 10 10 10 10
西部 6 8 7 5 5
山东 5 4 3 4 4
浙江 5 3 3 4 3

2.两种方案

(1) 多重for循环

Python3 a for b in c for a in b的用法 | 列表的嵌套 给出了多重for循环等价的形式:

c = [[7,8,9],[1,2,3],[4,5,6]]
l = [a for b in c for a in b]
print(l)# [7, 8, 9, 1, 2, 3, 4, 5, 6]

等价

c = [[7,8,9],[1,2,3],[4,5,6]]
k = []
for b in c:for a in b:k.append(a)
print(k)

(2) 使用 itertools.chain.from_iterable

from itertools              import chain
xx = [[[random.randint(100) for a in range(10)] for b in range(10)] for c in range(10)]
aa = list(chain.from_iterable(chain.from_iterable(xx)))

02更多的实验


1.多维维list表

这里是三维list表格,通过多重for循环来完成扁平遍历。

xx = [[[random.randint(100) for a in range(10)] for b in range(10)] for c in range(10)]
#printf(a)aa = [a for c in xx for b in c for a in b]
printf(aa)

[30, 23, 81, 56, 20, 55, 39, 13, 95, 63, 11, 20, 55, 38, 43, 39, 91, 76, 97, 34, 79, 27, 21, 78, 90, 44, 65, 99, 25, 99, 47, 47, 51, 44, 49, 73, 87, 6, 57, 20, 13, 30, 58, 21, 63, 89, 44, 70, 95, 18, 45, 79, 86, 59, 55, 28, 59, 26, 32, 67, 41, 48, 25, 53, 0, 49, 57, 53, 48, 70, 60, 76, 60, 30, 44, 19, 46, 45, 10, 71, 39, 12, 64, 41, 35, 76, 80, 32, 91, 75, 29, 16, 19, 83, 28, 8, 39, 24, 27, 11, 93, 5, 35, 96, 90, 73, 13, 3, 74, 9, 61, 60, 79, 23, 90, 96, 87, 32, 21, 23, 54, 44, 49, 37, 73, 16, 55, 5, 47, 89, 92, 9, 75, 58, 1, 74, 21, 76, 2, 16, 81, 64, 70, 56, 4, 83, 7, 45, 36, 62, 84, 87, 97, 63, 50, 45, 91, 16, 43, 2, 18, 45, 82, 79, 0, 85, 99, 58, 21, 56, 11, 54, 44, 85, 26, 16, 66, 87, 0, 51, 98, 22, 24, 57, 84, 61, 14, 71, 47, 19, 51, 75, 3, 72, 19, 78, 4, 26, 85, 79, 49, 30, 33, 52, 45, 80, 93, 73, 67, 73, 99, 34, 83, 12, 50, 74, 39, 25, 98, 32, 87, 15, 20, 99, 82, 92, 75, 79, 23, 5, 65, 7, 33, 87, 31, 34, 38, 13, 90, 66, 44, 50, 3, 86, 70, 24, 75, 31, 14, 4, 83, 6, 84, 42, 20, 8, 85, 2, 55, 79, 87, 21, 40, 84, 67, 76, 75, 2, 22, 70, 8, 65, 18, 94, 86, 12, 0, 14, 69, 42, 77, 33, 6, 46, 62, 56, 12, 23, 70, 25, 65, 2, 71, 5, 28, 41, 47, 61, 55, 48, 60, 1, 23, 1, 31, 14, 56, 53, 7, 44, 93, 79, 87, 60, 30, 57, 85, 1, 55, 5, 74, 53, 8, 88, 71, 85, 59, 47, 8, 20, 29, 24, 92, 15, 98, 55, 89, 95, 19, 49, 82, 72, 78, 41, 94, 1, 59, 60, 96, 83, 26, 68, 27, 29, 58, 51, 32, 41, 20, 13, 99, 9, 29, 95, 29, 1, 71, 87, 6, 25, 26, 41, 36, 76, 21, 60, 1, 75, 61, 42, 11, 84, 9, 85, 42, 58, 16, 4, 41, 94, 61, 98, 18, 91, 58, 13, 92, 79, 62, 23, 85, 76, 14, 36, 22, 53, 65, 28, 8, 71, 25, 41, 83, 59, 13, 88, 36, 63, 20, 18, 92, 61, 88, 21, 68, 85, 7, 23, 19, 98, 74, 28, 61, 86, 1, 49, 86, 35, 89, 90, 79, 72, 64, 79, 5, 75, 34, 31, 82, 7, 54, 13, 86, 11, 35, 13, 63, 54, 19, 99, 6, 46, 31, 60, 10, 3, 40, 76, 9, 94, 7, 96, 76, 67, 94, 68, 78, 52, 77, 64, 93, 92, 92, 25, 32, 40, 36, 23, 23, 54, 19, 49, 32, 72, 31, 67, 73, 62, 15, 61, 47, 26, 51, 51, 32, 73, 58, 41, 2, 3, 40, 39, 85, 55, 69, 14, 89, 13, 10, 24, 58, 67, 43, 79, 57, 30, 83, 97, 42, 76, 21, 52, 50, 97, 19, 40, 2, 12, 70, 43, 7, 84, 29, 69, 21, 64, 96, 3, 22, 40, 49, 50, 10, 63, 1, 29, 76, 33, 41, 38, 7, 60, 57, 12, 42, 46, 3, 53, 35, 52, 82, 99, 76, 81, 12, 9, 1, 97, 94, 38, 88, 2, 42, 76, 26, 36, 14, 4, 42, 86, 51, 29, 20, 94, 93, 46, 53, 99, 20, 98, 25, 48, 16, 19, 48, 57, 59, 49, 31, 85, 12, 66, 0, 86, 1, 71, 28, 32, 53, 28, 74, 78, 53, 80, 35, 86, 44, 68, 86, 60, 87, 78, 4, 37, 5, 31, 43, 93, 80, 31, 10, 93, 2, 67, 96, 5, 28, 60, 58, 92, 4, 77, 83, 26, 5, 89, 63, 88, 63, 80, 99, 69, 25, 30, 14, 29, 58, 79, 1, 50, 83, 80, 89, 32, 28, 78, 61, 69, 51, 56, 26, 13, 63, 13, 10, 75, 18, 51, 77, 42, 16, 79, 83, 55, 40, 4, 14, 25, 30, 56, 6, 44, 46, 68, 30, 11, 19, 96, 37, 95, 66, 12, 39, 16, 77, 4, 57, 52, 58, 52, 99, 63, 37, 3, 67, 26, 89, 19, 40, 66, 60, 59, 56, 19, 69, 90, 42, 74, 83, 78, 44, 62, 64, 16, 2, 22, 49, 57, 90, 84, 25, 58, 81, 4, 64, 20, 33, 28, 79, 40, 92, 60, 34, 64, 80, 65, 86, 41, 37, 40, 12, 51, 21, 14, 26, 80, 58, 90, 47, 49, 32, 4, 18, 38, 57, 46, 8, 10, 56, 51, 89, 94, 57, 73, 96, 19, 85, 41, 62, 12, 66, 20, 78, 98, 92, 80, 25, 46, 21, 75, 14, 64, 10, 9, 57, 5, 5, 66, 20, 9, 77, 18, 94, 30, 63, 6, 53, 26, 32, 3, 17, 6, 55, 72, 16, 70, 32, 58, 24, 34, 43, 88, 65, 12, 18, 74, 97, 46, 59, 56, 63, 24, 89, 46, 77, 90, 30, 68, 9, 5, 23, 93, 37, 25, 58, 83, 38, 6, 1, 66, 1, 22, 59, 54, 39, 65, 93, 30, 0, 47, 55, 71, 56, 78, 40, 91, 47, 14, 20, 43, 53, 48, 66, 59, 94, 48, 84, 65, 28, 72, 93, 44, 19, 25, 79, 7, 21, 4, 99, 17, 57, 54, 14, 16, 93, 54, 86, 90, 63, 26, 92, 88, 24, 37, 92, 19, 1, 42, 39, 15, 56, 13, 3, 9, 52, 87, 87, 10, 61, 56, 62, 92, 60, 55, 86, 82, 65, 48, 75, 39, 10, 18, 92, 96, 97, 66, 41, 77, 49, 38, 85, 24, 88, 81, 59, 46, 42, 12, 28, 80, 16, 12, 82, 34, 90, 60, 14, 42, 98, 51, 40, 96, 29, 28, 37, 8, 84, 28, 70, 54, 47, 35, 30, 27, 34, 22, 16, 72, 74, 51]

同样使用chain.from_iterable() 也可以产生同样的结果。

(2) 使用多重tuple

xx = (((random.randint(100) for a in range(10)) for b in range(10)) for c in range(10))

结果是一样的。

2.统计上述表格数量

string = ('东北  3   3   3   4   3',\'华北   5   4   4   5   6',\'华东   8   9   10  9   9',\'华南   9   10  10  10  10',\'西部  6   8   7   5   5',\'山东   5   4   3   4   4',\'浙江   5   3   3   4   3',)strint = [int(a) for b in string for a in b.split('\t') if a.isdigit()]
printf(strint)
printf(sum(sum(strint)))

[3, 3, 3, 4, 3, 5, 4, 4, 5, 6, 8, 9, 10, 9, 9, 9, 10, 10, 10, 10, 6, 8, 7, 5, 5, 5, 4, 3, 4, 4, 5, 3, 3, 4, 3]
203

注意:
实际上对于二维数字数组可以直接使用sum()来完成对数字所有数字的累加。

➤ ※ 结论


使用[]之内的多重循环,注意到他的等价形式,可以大大简化程序的书写。


■ 相关文献链接:

  • Python3 a for b in c for a in b的用法 | 列表的嵌套

Python | [a for b in c for a in b]的用法相关推荐

  1. Python爬虫入门(4):Urllib库的高级用法

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  2. python中byte2array报错_python基础-bytes和bytearray的用法

    Python中的序列类型有bytes和bytearray. 二进制序列类型的用法比较少见,是python中少用的一种序列类型,对于二进制序列类型,大家基本了解即可. bytes二进制序列类型 指定长度 ...

  3. python中str的index什么意思_python中index的用法是什么

    index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如:>>> t=tuple('Allen') >>> t ('A', 'l', ...

  4. python中sorted函数逆序_Python中sorted函数的用法(转)

    [Python] sorted函数 我们需要对List.Dict进行排序,Python提供了两个方法 对给定的List L进行排序, 方法1.用List的成员函数sort进行排序,在本地进行排序,不返 ...

  5. python str byte编码_Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题...

    Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str ...

  6. python中使用函数的优点_Python基础之函数基本用法与进阶详解

    本文实例讲述了Python基础之函数基本用法与进阶.分享给大家供大家参考,具体如下: 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数 ...

  7. Python 基础篇-正斜杠(/)和反斜杠(\)的用法

    今天为大家讲一讲正反斜杠的常见应用:一个就是路径里的应用,还有就是反斜杠在正则表达式里的不同. 路径上的应用 首先告诉大家,用于路径上,python是不区分正("/")反(&quo ...

  8. 【Python】Numpy库之符号函数sign()的介绍及用法

    1.sign()函数功能介绍 sign()是Python的Numpy中的取数字符号(数字前的正负号)的函数. 2.sign()函数用法代码演示 #导入numpy库 import numpy as np ...

  9. Python 数据处理函数 round()、int()、floor()、ceil()的用法

    对每位程序员来说,在编程过程中数据处理是不可避免的,很多时候都需要根据需求把获取到的数据进行处理,取整则是最基本的数据处理.取整的方式则包括向下取整.四舍五入.向上取整等等 向下取整:int() 四舍 ...

最新文章

  1. 【mysql学习笔记整理】
  2. 确认过眼神,这就是你要的路由库
  3. 信息化及信息化的五个层次
  4. Operating System Concepts--chap9 Memory Management;
  5. python websocket server_用Python实现一个简单的WebSocket服务器
  6. vue2.0 #$emit,$on的使用
  7. iOS 文字转化成图片
  8. Java动态代理生成的对象导出方法
  9. Oracle中对象权限与系统权限revoke
  10. Axure高保真web端后台管理系统/垃圾回收分类系统/垃圾回收高保真原型设计 /垃圾分类后台管理系统/垃圾回收分类平台//垃圾回收分类智慧管理系统/订单管理/财务管理/系统管理/库存管理/设备管理
  11. ETHREAD APC 《寒江独钓》内核学习笔记(4)
  12. 这款Linux 恶意软件正在劫持全球的超级计算机
  13. xtragrid 某个值 查找_XtraPivotGrid根据列(行)的汇总值对列(行)标头进行查找...
  14. 通过反射修改强转值类型_什么是反射机制?反射机制的应用场景有哪些?
  15. Java 后端开发工程师进阶路线
  16. PMP 考点 第十一章 项目风险管理
  17. 『晨读』纳什均衡又称为非合作博弈均衡,在一个博弈过程中,
  18. ABAQUS常用量纲
  19. 浅谈互联网寒冬Android进阶之路
  20. 关于ISI、SCI、EI、IEEE、Elsevier、Springer的区别

热门文章

  1. Java Socket通信编程
  2. JAVA字符串格式化-String.format()的使用
  3. 网络连接、路由配置等
  4. 在Android开发中怎样调用系统Email发送邮件
  5. 数组拷贝问题的解决方法
  6. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(6月25日-7月1日)
  7. RedHat5下scrumworks pro 5.0安装详细说明
  8. 安装Ubuntu18.04遇到的问题
  9. 使用两个ThreadPool
  10. Javascript 绑定事件和 this理解