Python 列表推导式:简洁、高效的数据操作艺术

Python 的列表推导式,这个看似简单的语法糖,实则内含无限威力。在 Python 代码编写中,列表推导式的灵活性和简洁性让它成为了不可或缺的一部分。在这篇文章中,我们将更全面、更深入地探讨列表推导式,从基础的概念认识,到各类进阶的用法和操作,我们一一揭秘。最后,我们还将在 "One More Thing" 部分分享一个非常有趣且实用的列表推导式技巧,这会让你在编程道路上又多一份强大的工具。

1. 列表推导式:语法糖的力量

列表推导式,就是一种在 Python 中创建列表的方式,它的基础形式如下:

[expression for item in iterable]

它实质上是一个 for 循环的简化形式。例如,我们可以用它来创建一个包含 0 到 9 平方的列表:

squares = [x**2 for x in range(10)]
print(squares) # Output: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

这样,你不需要再使用传统的 for 循环来创建列表,代码更加简洁和清晰。

2. 过滤元素:带条件的列表推导式

列表推导式更强大的地方在于,我们可以在其中加入条件判断,以过滤出我们想要的元素:

even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # Output: [0, 4, 16, 36, 64]

在这个例子中,我们只生成了偶数的平方,只需加入一个简单的 if 条件,我们就可以灵活地过滤出我们需要的元素。

3. 复杂的数据结构:嵌套的列表推导式

更进一步,列表推导式还可以嵌套使用,处理更复杂的数据结构,比如我们要将一个嵌套列表展平:

nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened_list = [x for sublist in nested_list for x in sublist]
print(flattened_list) # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]

这个例子中,我们将一个二维的嵌套列表展平成了一维列表,就像是将多层次的数据展开,方便我们进行后续处理。

4. 数据变形:带表达式的列表推导式

列表推导式中的表达式可以帮助我们对数据进行变形:

strings = ['Hello', 'World', 'In', 'Python']
lowercase_strings = [s.lower() for s in strings]
print(lowercase_strings) # Output: ['hello', 'world', 'in', 'python']

在这个例子中,我们将一个包含几个字符串的列表,通过 str.lower() 函数,将其转换成了全小写。通过改变表达式,我们可以在生成新列表的同时,对数据进行各种变形操作。

5. 推广至其他数据结构:字典和集合的推导式

推导式不仅仅可以应用于列表,还可以推广到字典和集合中:

squared_dict = {x: x**2 for x in range(5)}
print(squared_dict) # Output: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} squared_set = {x**2 for x in range(5)}
print(squared_set) # Output: {0, 1, 4, 16, 9}

这两个例子分别演示了字典推导式和集合推导式的用法,这些结构的推导式可以更方便我们处理复杂的数据结构。

6. 性能优化:列表推导式与 map/filter 的比较

列表推导式不仅代码更加简洁,实际上在很多情况下,列表推导式的执行效率也优于传统的 mapfilter 函数:

import time

# Using list comprehension
start_time = time.time()
squares = [x**2 for x in range(1000000)]
end_time = time.time()
print(f"List comprehension took {end_time - start_time} seconds") # Using map function
start_time = time.time()
squares = list(map(lambda x: x**2, range(1000000)))
end_time = time.time()
print(f"Map function took {end_time - start_time} seconds")

在这个例子中,我们分别用列表推导式和 map 函数创建一个包含一百万个元素的列表,可以看到列表推导式的执行时间通常要少于 map 函数。

One More Thing

在我的 GitHub 学习过程以及在各种技术博客中阅读,我发现一个关于列表推导式的有趣且实用的技巧,那就是使用列表推导式实现全排列:

perms = [(x, y, z) for x in range(3) for y in range(3) for z in range(3) if x != y and y != z and x != z]
print(perms) # Output: [(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]

这个例子通过列表推导式生成了 3 个元素的全排列,使用了嵌套循环和条件判断,非常简洁而高效。

总的来说,Python 的列表推导式是一个非常强大而灵活的工具,能够帮助我们更好地处理数据和创建数据结构。希望这篇文章能帮助你更深入地理解和应用列表推导式,让你的 Python 代码更加简洁和高效。

如有帮助,请多关注

个人微信公众号:【Python全视角】

TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

Python 列表推导式:简洁、高效的数据操作艺术的更多相关文章

  1. python 列表推导式 - python基础入门(16)

    截止到目前为止,python基础内容已经学习了50%左右,在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率更高. 一.什么是推导式 推导式是从一个或者多个 ...

  2. Python列表推导式和嵌套的列表推导式

    列表推导式提供了一个更简单的创建列表的方法.常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列. 例如,假设我们想创建一个平方 ...

  3. python列表推导式详解

    推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...

  4. python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解

    推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...

  5. python列表推导式(扫盲)

    1) 简单了解: 所谓的列表推导式,就是指的轻量级循环创建列表. 格式: 列表推导式的常见形式: my_list = [ item for item in iterable] my_list: 列表名 ...

  6. python 列表推导式

    squares = [x**2 for x in range(10)] 相当于squares = map(lambda x: x**2, range(10)),但是更简洁和易读.傻逼才会用最古老的fo ...

  7. Python: 列表推导式--轻量级循环

    定义: 列表推导式(list comprehension)是利用其他列表创建新列表的一种方法,其工作方式类似于for循环,对列表进行过滤变种操作 eg1: >>> [x*x for ...

  8. python(列表推导式和生成器表达式)

    从母鸡下蛋的故事讲起 老母鸡 = ('鸡蛋%s'%i for i in range(10)) print(老母鸡) for 蛋 in 老母鸡: print(蛋) g = (i*i for i in r ...

  9. 迭代列表不要For循环,这是Python列表推导式最基本的概念

    如果你还在使用 For 循环迭代列表,那么你需要了解了解列表推导式,看看它的基本概念都是什么. 列表解析式(List comprehension)或者称为列表推导式,是 Python 中非常强大和优雅 ...

  10. Python列表推导式玩法

    前言 列表做为python的基础,是必须学习的语法之一.一些基础的之前已经是反复温习和使用了,今天我们来学习它的进阶版-->列表推导式. 列表推导式: 优点:是将所有的值一次性加载到内存中,相比 ...

随机推荐

  1. Kafka 事务

    更多内容,前往IT-BLOG 在了解 Kafka的事务之前,先说一下 Kafka中幂等和事务(Kafka 0.11.0.0版本引入的两个特性)以此来实现 Exactly once(精确一次)了解更多链 ...

  2. 商品获价API调用说明:获取商品历史价格信息 代码分享

    接口名称:item_history_price 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中)(获取测试key和secret接入) secre ...

  3. mybatis初级教程

    resultType与resultMap resultType:设置默认的映射关系 resultMap:设置自定义的映射关系 查询功能必须设置这两个其中的一个 在resources下面创建包,那么就得 ...

  4. 通过python修改本地ip

    写在前面, 1 对于个人公司需要固定ip,而回家需要用到家里的ip, 2对于公司it人员,每台电脑都需要设置ip,,尤其批量的时候,这个作为it的自己知道 3运维人员,可以通过ip测试哪些ip可以用, ...

  5. [数据库]MYSQL之存储过程

    一 存储过程的特点 MySQL 5.0 版本开始支持存储过程 1.1 定义 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象. 存储过程是为了 ...

  6. 逍遥自在学C语言 | 位运算符&的高级用法

    前言 在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位 ...

  7. Android View的事件分发机制-源码解析

    为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志: 然后把我们自定义的按钮加到主布局文件中: public clas ...

  8. 脚本:auto_send_tablespace定期发送表空间巡检到邮箱

    简述:周期定时发送表空间到指定邮箱内 1.修改邮箱配置 /etc/mail.rc,具体细节见网上教程 $ vi /etc/mail.rc set from=123456@qq.comset smtp= ...

  9. 最新升级优化 shopee|美客多 Mercadolibre|shopfiy|lazada|独立货代贴单系统 可规模化的贴单打单系统 源码下载独立部署

    七想网络 跨境猴 最新优化改进版本的 虾皮代打包-虾皮代贴单 独立部署源码版本货代贴单系统 介绍: 台湾海外仓_shopee货代_虾皮物流–虾皮代贴单 虾皮代打包-虾皮代贴单-虾皮货代平台 shope ...

  10. java.lang.OutOfMemoryError- unable to create new native thread 问题排查

    问题描述 最近连续两天大约凌晨3点,线上服务开始异常,出现OOM报错.且服务所在的物理机只能ping通,但是无法登录.报错信息如下: ERROR 04-12 03:01:43,930 [Default ...