社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python 炫技操作(03):连接列表的八种方法

Python编程时光 • 5 年前 • 646 次点击  

点击上方“Python编程时光”,选择“加为星标

第一时间关注Python技术干货!



系列导读

Python 炫技操作(01):条件语句的七种写法
Python 炫技操作(02):合并字典的七种方法


Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的。在这些人的眼里,能够写出那些一般开发者看不懂的高级特性,就是高手,就是大神。

但你要知道,在团队合作里,炫技是大忌。

为什么这么说呢?我说下自己的看法:

  1. 越简洁的代码,越清晰的逻辑,就越不容易出错;

  2. 在团队合作中,你的代码不只有你在维护,降低别人的阅读/理解代码逻辑的成本是一个良好的品德

  3. 简单的代码,只会用到最基本的语法糖,复杂的高级特性,会有更多的依赖(如语言的版本)

该篇是「炫技系列」的第三篇内容,在这个系列里,我将总结盘点一下,我所见过的那些炫技操作。在这里,如果你是 Python 发烧友,你可以学到一些写出超酷的代码书写技巧。同时,看了这些内容,对你在阅读别人的代码时,也许会有些帮助。

1. 最直观的相加

使用 + 对多个列表进行相加,你应该懂,不多说了。

>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> list01 + list02 + list03
[123456789]
>>> 

2. 借助 itertools

itertools 在 Python 里有一个非常强大的内置模块,它专门用于操作可迭代对象。

在前面的文章中也介绍过,使用 itertools.chain() 函数先可迭代对象(在这里指的是列表)串联起来,组成一个更大的可迭代对象。

最后你再利用 list 将其转化为 列表。

>>> from functools import chain
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> list(chain(list01, list02, list03))
[123456789]
>>>

3. 使用 * 解包

Python 炫技操作(02):合并字典的七种方法 提到了使用 ** 可解包字典。

与它相似的,使用 * 可以解包列表。 *  和 ** 常用在函数定义时,设置可变参数。

现在我将它单独拿出来用在多个列表的合并。

示例如下:

>>> list01 = [1,2,3]
>>> list02 = [4,5,6 ]
>>>
>>> [*list01, *list02]
[123456]
>>>

4. 使用 extend

在字典中,使用 update 可实现原地更新,而在列表中,使用 extend 可实现列表的自我扩展。

>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>>
>>> list01.extend(list02)
>>> list01
[123456]

5. 使用列表推导式

Python 里对于生成列表、集合、字典,有一套非常 Pythonnic 的写法。

那就是列表解析式,集合解析式和字典解析式,通常是 Python 发烧友的最爱,那么今天的主题:列表合并,列表推导式还能否胜任呢?

当然可以,具体示例代码如下:

>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> [x for l in (list01, list02, list03) for x in l]
[123456789]
>>>

6. 使用 heapq

heapq 是 Python 的一个标准模块,它提供了堆排序算法的实现。

该模块里有一个 merge 方法,可以用于合并多个列表,如下所示

>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> from heapq import merge
>>>
>>> list(merge(list01, list02, list03))
[123456789]
>>> 

要注意的是,heapq.merge 除了合并多个列表外,它还会将合并后的最终的列表进行排序。

>>> list01 = [2,5,3]
>>> list02 = [1,4,6]
>>> list03 = [7,9,8]
>>> 
>>> from heapq import merge
>>> 
>>> list(merge(list01, list02, list03))
[124536798]
>>> 

它的效果等价于下面这行代码:

sorted(itertools.chain(*iterables))

如果你希望得到一个始终有序的列表,那请第一时间想到 heapq.merge,因为它采用堆排序,效率非常高。但若你不希望得到一个排过序的列表,就不要使用它了。

7. 借助魔法方法

在之前的文章里,把魔法方法介绍得很全。

非常全的通俗易懂 Python 魔法方法指南(上)

非常全的通俗易懂 Python 魔法方法指南(下)

其中有一个魔法方法是 __add__,实际 上当我们使用第一种方法 list01 + list02 的时候,内部实际上是作用在 __add__ 这个魔法方法上的.

所以以下两种方法其实是等价的

>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>
>>> list01 + list02
[123456]
>>
>>> 
>>> list01.__add__(list02)
[123456]
>>

借用这个魔法特性,我们可以 reduce 这个方法来对多个列表进行合并,示例代码如下

>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> from functools import reduce
>>> reduce(list.__add__, (list01, list02, list03))
[123456789]
>>>

8. 使用 yield from

在很早的一篇文章里(并发编程08|深入理解yield from语法),我很详细的介绍了 yield from 意义及使用方法。

在 yield from 后可接一个可迭代对象,用于迭代并返回其中的每一个元素。

因此,我们可以像下面这样自定义一个合并列表的工具函数。

>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> def merge(*lists):
...   for l in lists:
...     yield from l
...
>>> list(merge(list01, list02, list03))
[123456789]
>>>



看到这里,有没有涨姿势了,学了这么久的 Python ,没想到合并列表还有这么多的方法。本篇文章的主旨,并不在于让你全部掌握这 7 种合并列表的方法,实际上,你只要选用一种最顺手的方式即可。


但是在协同工作中,或者在阅读他人代码时,你不可避免地会碰到各式各样的写法,这时候你能下意识的知道这是在做合并列表的操作,那这篇文章就是有意义的。


明哥原创文都已传至 Github:https://github.com/iswbm/PythonCodingTime

本文永久博客链接:http://python.iswbm.com/en/latest/c01/c01_41.html


最后,想看更多这个系列的朋友,请帮忙 转发文章、或者 点个在看,只有看的人多了,我的更新速度也才能快起来。



推荐阅读



用动画展示Pycharm十大实用技巧

一文学会制作6种炫酷的Python动态图

一份可以令 Python 变快的工具清单

不懂爬虫也能轻易爬取数据的6大工具

Python什么情况下会生成pyc文件?

Python炫技操作(02):合并字典的七种方法

记一次 Python Web 接口优化




长按下图  ➡   关注博主

(按左边关注 Python, 按右边关注 Goalng


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/61929
 
646 次点击