Python知识点:如何高效的把二维列表合并成一维?也就是打平

要实现的目标
有如下列表:

nums_2d = [[12,3],[4,5,6,7],[8,9]]
1
要求把它合并成一维列表:

nums_1d = [1,2,3,4,5,6,7,8,9]
1
普通青年的方法
普通青年使用for循环和extend函数:

nums_2d = [[1,2,3],[4,5,6,7],[8,9]]

nums_1d = []
for n in nums_2d:
 nums_1d.extend(n)

print(nums_1d)
1
2
3
4
5
6
7
extend() 函数把一个列表里的元素逐个添加到前面的列表中。这里不能使用 +,因为这样会把子列表作为一个元素加进去,没有实现打平的目的。

如果要一定使用+也可以,那要使用两层的for循环,效率比较差。

文艺青年的方法
上面的实现竟然用了3行代码,这样一点都不pythonic,来个文艺点的做法,一行搞定:

nums_2d = [[1,2,3],[4,5,6,7],[8,9]]

nums_1d = [item for sublist in nums_2d for item in sublist]

print(nums_1d)
1
2
3
4
5
这里用了推导式,里面稍微有点难以理解。你可以这样想:

这就是个两层for循环,前面是外层循环(加粗),后面内层循环:item for sublist in nums_2d for item in sublist
内层循环的结果(也就是item变量)都放在一个列表中,这样就实现了打平的效果
博士青年的方法
如果你见多识广,可能会用functools的reduce方法:

import functools, operator
nums_2d = [[1,2,3],[4,5,6,7],[8,9]]

nums_1d = functools.reduce(operator.concat, nums_2d)

print(nums_1d)
1
2
3
4
5
6
functools的reduce函数会把nums_2d中的子列表逐次合并(operator.concat),直到里面只有一个列表为止,从而也实现了打平的目的。

这里除了用operator.concat,也可以自己传入一个函数,或者就地定义一个匿名函数:

import functools
nums_2d = [[1,2,3],[4,5,6,7],[8,9]]

nums_1d = functools.reduce(lambda x, y: x + y, nums_2d)

print(nums_1d)
1
2
3
4
5
6
还有其他更多的方法,但是没必要像孔乙己数茴香豆一样:列举茴香豆的茴字有8种写法。

那个最快
那个效率更好一点呢?

数据说话,用timeit来测试一下他们的效率:

普通青年 - 12.5
maishu@msmacbook ~ % python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'n=[]' 'for tt in t:' '    n.extend(tt)'
20000 loops, best of 5: 12.4 usec per loop
1
2
普通青年 - 16.5
maishu@msmacbook ~ % python -mtimeit -s'nums_2d=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in nums_2d for item in sublist]'
20000 loops, best of 5: 16.5 usec per loop
1
2
博士青年 - 219,238
maishu@msmacbook ~ % python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'import functools' 'import operator' 'functools.reduce(operator.concat,t)'
1000 loops, best of 5: 219 usec per loop
1
2
maishu@msmacbook ~ % python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'import functools' 'functools.reduce(lambda x,y: x+y,t)'
1000 loops, best of 5: 238 usec per loop
1
2
普通青年完胜!看来做个普通青年也没什么不好的。不是吗?

有时候我们会为了pythonic而pythonic,总想一行代码实现一个功能,到处找最好的方法,其实写个简单的for循环也挺好的。

职业发展
作为一个代码打工仔,对于绝大部分程序员来说,想要成为牛逼的真正挣钱程序员的路还很长,一刻都不能懈怠。

我们无法从HR角度,或者技术leader的角度来臆测哪种状态的面试更能获取面试官青睐。但通过我们积攒的大量的面试经验,大家多少可以推断一些成为有竞争力的程序员的一些必要条件。

大佬云集、资料丰富
当初我在字节认识一个非常非常资深的前辈,他到字节比我早三年,但因为各种原因级别不是很高。我当时问他,既然你对现状如此不满,为什么不想着离开寻找更好的机会呢?

他沉思了片刻跟我说,他说我现在在这里虽然待着不顺心,但是我接触到的人都是非常优秀的。我遇到问题,还可以和你们讨论讨论。我如果出去了,我要是再遇到问题,可能连一个讨论的人都没有。

我当时听听只是觉得有道理,现在再回想起来,感受非常深刻。三观、格局、能力,能够进入大公司的,这三个方面一般都不会太差。别的不说,就拿个人能力而言,我曾出国出差过几个月,有幸见识了许多各种海外名校的同事,和他们学习交流人工智能,这真的让我AI有了更深层次的认识。

除了优秀的同事之外,大公司里往往还有丰富的内部文档和资料。我当时在字节内部看到了很多优秀的文章,也有很多优秀的技术沙龙和分享。现在想起来两年下来,也没有去过几次,文章和资料看得也不算多,现在想想颇为遗憾。别的不说,就拿推荐领域而言,近些年质量不错的论文往往都来源于大公司尤其是国内的大公司,以腾讯、华为和头条为主。除了公开的论文,公司内部还有很多技术相关的资料和文档,这些真的可以说是有价无市,非常珍贵。

Python 知识手册

Linux 知识手册

爬虫查询手册

而且,这些资料不是扫描版的,里面的文字都可以直接复制,非常便于我们学习:

数据分析知识手册:


机器学习知识手册:


金融量化知识手册:

岗位内推、学习交流
我们大量需要前端岗位、python岗位、Java 岗位、Android 和 iOS 的开发岗位,工作地点:北京字节,欢迎校招社招扫描下方二维码找我内推

Python资料、技术、课程、解答、咨询也可以直接点击下面名片,添加官方客服斯琪↓
————————————————
版权声明:本文为CSDN博主「Yuki程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Yuki1127918/article/details/123284441

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值