很多人不知道的Python 炫技操作:连接列表的八种方法

简介: Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的。在这些人的眼里,能够写出那些一般开发者看不懂的高级特性,就是高手,就是大神。但你要知道,在团队合作里,炫技是大忌。为什么这么说呢?我说下自己的看法:越简洁的代码,越清晰的逻辑,就越不容易出错;在团队合作中,你的代码不只有你在维护,降低别人的阅读/理解代码逻辑的成本是一个良好的品德简单的代码,只会用到最基本的语法糖,复杂的高级特性,会有更多的依赖(如语言的版本)该篇是「炫技系列」的第三篇内容,在这个系列里,我将总结盘点一下,我所见过的那些炫技操作。在这里,如果你是 Python 发烧友

Python 语言里有许多(而且是越来越多)的高级特性,是 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]

复制代码

  1. 借助 itertools

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

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

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

from itertools 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]

复制代码

  1. 使用 * 解包

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

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

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

示例如下:

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

[list01, list02]
[1, 2, 3, 4, 5, 6]

复制代码

  1. 使用 extend

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

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

list01.extend(list02)
list01
[1, 2, 3, 4, 5, 6]
复制代码

  1. 使用列表推导式

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]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

复制代码

  1. 使用 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,因为它采用堆排序,效率非常高。但若你不希望得到一个排过序的列表,就不要使用它了。

  1. 借助魔法方法

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

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

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

其中有一个魔法方法是 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]

复制代码

  1. 使用 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))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

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

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

目录
相关文章
|
14天前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
114 68
WK
|
13天前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
65 36
|
13天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
15 1
|
14天前
|
弹性计算 安全 数据处理
Python高手秘籍:列表推导式与Lambda函数的高效应用
列表推导式和Lambda函数是Python中强大的工具。列表推导式允许在一行代码中生成新列表,而Lambda函数则是用于简单操作的匿名函数。通过示例展示了如何使用这些工具进行数据处理和功能实现,包括生成偶数平方、展平二维列表、按长度排序单词等。这些工具在Python编程中具有高度的灵活性和实用性。
|
7天前
|
测试技术 API 数据安全/隐私保护
Python连接到Jira实例、登录、查询、修改和创建bug
通过使用Python和Jira的REST API,可以方便地连接到Jira实例并进行各种操作,包括查询、修改和创建Bug。`jira`库提供了简洁的接口,使得这些操作变得简单易行。无论是自动化测试还是开发工作流的集成,这些方法都可以极大地提高效率和准确性。希望通过本文的介绍,您能够更好地理解和应用这些技术。
38 0
|
11天前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
13 0
|
11天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
13 0
|
12天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy教程之SciPy模块列表15:单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。功率单位以瓦特(W)表示,1W=1J/s。示例代码展示了如何使用`constants`模块获取马力(hp)的值,结果为745.6998715822701。
15 0
|
12天前
|
C语言 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第24天】在Python编程的世界中,追求代码的简洁性和可读性是永恒的主题。列表推导式(List Comprehensions)作为Python语言的一个特色功能,提供了一种优雅且高效的方法来创建和处理列表。本文将深入探讨列表推导式的使用场景、语法结构以及如何通过它简化日常编程任务。
|
13天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy 教程之 SciPy 模块列表 13 - 单位类型。常量模块包含多种单位:公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例:`constants.zero_Celsius` 返回 273.15 开尔文,`constants.degree_Fahrenheit` 返回 0.5555555555555556。
12 0
下一篇
无影云桌面