Python | [a for b in c for a in b]的用法

举报
tsinghuazhuoqing 发表于 2021/12/26 00:36:24 2021/12/26
【摘要】 简 介: 很多情况下需要对于多维数组进行扁平化,当然可以借助于 numpy 中的 flat 来进行,但直接使用Python的 list 标准操作可以简化程序。但这需要对与其中多重循环的含义有所了...

简 介: 很多情况下需要对于多维数组进行扁平化,当然可以借助于 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()来完成对数字所有数字的累加。

 

※ 结论


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


■ 相关文献链接:

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/109130497

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。