Python 合并列表的八种实用方法
本文详细解析Python中合并列表的八种常见方法,包括使用加号、itertools.chain、解包操作符、extend方法、列表推导式、heapq.merge、魔法方法__add__结合reduce以及yield from生成器。文章强调在团队协作中,代码简洁性与可读性优于炫技,建议根据具体场景(如是否需要排序、性能要求等)选择最合适的合并策略,并指出理解多种写法有助于阅读他人代码。
Python 语言拥有众多高级特性,深受资深开发者喜爱。在他们看来,能够编写出普通开发者难以理解的高级代码,往往被视为技术实力的象征。
然而,在团队协作环境中,过度展示技巧往往是不可取的。
对此,我有以下几点看法:
- 代码越简洁,逻辑越清晰,出现错误的概率就越低;
- 在团队项目中,代码并非仅由你一人维护,降低他人阅读和理解代码逻辑的成本,是一种良好的职业素养;
- 简单的代码通常只涉及基础语法,而复杂的高级特性可能会引入更多的依赖关系(例如对特定 Python 版本的依赖)。
1. 最直观的相加
使用 + 运算符对多个列表进行相加,这是最基础的操作,此处不再赘述。
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> list01 + list02 + list03
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
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))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
3. 使用 * 解包
使用 * 运算符可以解包列表。* 和 ** 通常用于函数定义时设置可变参数。
现在,我们将它单独提取出来,用于合并多个列表。
示例如下:
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>>
>>> [*list01, *list02]
[1, 2, 3, 4, 5, 6]
>>>
4. 使用 extend
在字典中,使用 update 方法可实现原地更新;而在列表中,使用 extend 方法可实现列表的自我扩展。
>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>>
>>> list01.extend(list02)
>>> list01
[1, 2, 3, 4, 5, 6]
5. 使用列表推导式
Python 为生成列表、集合和字典提供了一套非常 Pythonic 的写法。
那就是列表解析式、集合解析式和字典解析式,这通常是 Python 爱好者的最爱。那么,对于今天的主题:列表合并,列表推导式是否也能胜任呢?
当然可以,具体示例代码如下:
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> [x for l in (list01, list02, list03) for x in l]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
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))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
需要注意的是,heapq.merge 除了合并多个列表外,还会将合并后的最终列表进行排序。
>>> list01 = [2,5,3]
>>> list02 = [1,4,6]
>>> list03 = [7,9,8]
>>>
>>> from heapq import merge
>>>
>>> list(merge(list01, list02, list03))
[1, 2, 4, 5, 3, 6, 7, 9, 8]
>>>
它的效果等价于下面这行代码:
sorted(itertools.chain(*iterables))
如果你希望得到一个始终有序的列表,请第一时间想到 heapq.merge,因为它采用堆排序,效率非常高。但若你不希望得到一个排过序的列表,就不要使用它了。
7. 借助魔法方法
利用魔法方法 __add__,实际上,当我们使用第一种方法 list01 + list02 的时候,内部实际上是调用了 __add__ 这个魔法方法。
所以以下两种方法是等价的:
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>>
>>> list01 + list02
[1, 2, 3, 4, 5, 6]
>>>
>>>
>>> list01.__add__(list02)
[1, 2, 3, 4, 5, 6]
>>>
借用这个魔法特性,我们可以利用 reduce 方法对多个列表进行合并,示例代码如下:
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> from functools import reduce
>>> reduce(list.__add__, (list01, list02, list03))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
8. 使用 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))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
看到这里,你是否感到增长了见识?学习了这么久的 Python,没想到合并列表还有这么多方法。本文的主旨并非要求你全部掌握这 7 种(注:原文标题为八种,此处列举了除第一种外的7种高级或特定写法,加上第一种共8种,但正文描述略有混淆,此处忠实于原文语境)合并列表的方法,实际上,你只需选用一种最顺手的方式即可。
但是在协同工作中,或者在阅读他人代码时,你不可避免地会碰到各式各样的写法。这时候,如果你能下意识地知道这是在做合并列表的操作,那么这篇文章就是有意义的。
以上就是 Python 连接列表的八种方法的详细内容,更多关于 Python 连接列表的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









