python视频教程栏目介绍Python列表推导式的使用。

Python 列表推导式并不是给初学者用的,因为它非常反直觉,甚至对于有其他编程语言背景的人也是如此。

我们接触到 List 的使用时,学习的内容都是零散的。所以我们缺少一个关于如何在各种各样的场景下使用 List 的知识体系。

本文提供了一些 List 的使用指南,尽可能涵盖各个方面。希望本文可以成为你的一站式实用手册。

使用建议

1.建议使用迭代的方式

使用 List 最基本的方式是以一个可迭代对象为基础,创建一个 List 对象,这个可迭代对象可以是任意可以迭代元素的Python对象。使用方法如下。[expression for item in iterable]

下面这段代码展示了一个使用列表相关技术创建 List 对象的例子。在这个例子中,我们定义了一个 Integer 列表,并基于这个对象创建了保存每个数字的平方数和立方数的 List 对象。>>> # 创建一个 Integer 列表

>>> integers = [1, 2, 3, 4, 5, 6]

>>> # 创建平方数和立方数列表

>>> powers = [(x*x, pow(x, 3)) for x in integers]

>>> print(powers)

[(1, 1), (4, 8), (9, 27), (16, 64), (25, 125), (36, 216)]

上面的例子把 List 对象当作迭代器使用。我们应该知道,许多类型的对象也是可迭代的,比如 List、Set、Dictionary 和 String 等等。其他数据类型,像 range、map、filter,以及 pandas 包中的 Series、DataFrame,都是可迭代的。下面的代码演示了某些对象的使用方法。>>> # 使用 range 对象

>>> integer_range = range(5)

>>> [x*x for x in integer_range]

[0, 1, 4, 9, 16]

>>> # 使用 Series 对象

>>> import pandas as pd

>>> pd_series = pd.Series(range(5))

>>> print(pd_series)

0 0

1 1

2 2

3 3

4 4

dtype: int64

>>> [x*x for x in pd_series]

[0, 1, 4, 9, 16]

2.如果只需用到其中的某些元素,应当使用条件判断语句

假设你需要将符合某种条件的元素归集起来,并创建一个 list。下面展示了相关的语法。[expression for item in iterable if condition]

if 语句用来实现条件判断。下面的代码展示了这种用法的一个简单示例。>>> # 同样创建一个 Integer 列表

>>> integers = [1, 2, 3, 4, 5, 6]

>>> # 筛选出偶数,创建一个这些偶数的平方数列表

>>> squares_of_evens = [x*x for x in integers if x % 2 == 0]

>>> print((squares_of_evens))

[4, 16, 36]

3.使用条件判断语句

List 对象中还可以使用 if-else 形式的条件判断,语法如下。[expression0 if condition else expression1 for item in iterable]

这跟前面的那种用法有些类似,别把这两种用法混淆。在本例中,条件语句本身是一个整体。下面的代码提供了一个例子。>>> # 创建一个 Integer 列表

>>> integers = [1, 2, 3, 4, 5, 6]

>>> # 遍历 integers 中的元素,如果是偶数,取平方数存入新的列表

>>> # 如果是奇数,取立方数存入新的列表

>>> custom_powers = [x*x if x % 2 == 0 else pow(x, 3) for x in integers]

>>> print(custom_powers)

[1, 4, 27, 16, 125, 36]

4.如果有嵌套结构,可以使用嵌套的循环

有可能可迭代对象中的元素自身也是可迭代的,尽管这种情况不太常见。如果你对嵌套的可迭代对象有兴趣,可以使用 for 来实现循环嵌套。语法如下。[expression for item_outer in iterable for item_inner in item_outer]

# 与下面的代码等同

for item_outer in iterable:

for item_inner in item_outer:

expression

上面的代码展示了使用for实现嵌套循环的例子。>>> # 创建一个包含元组的列表

>>> prices = [('$5.99', '$4.99'), ('$3.5', '$4.5')]

>>> # 获取元组中的每个价格,以此创建一个一维列表

>>> prices_formatted = [float(x[1:]) for price_group in prices for x in price_group]

>>> print(prices_formatted)

[5.99, 4.99, 3.5, 4.5]

5.替换高阶函数

有的人比较习惯函数式编程,比如使用高阶函数也是这种习惯的表现之一。特别说明一下,高阶函数是那些需要使用输入或输出参数的函数。在 Python 中,常用的高阶函数有 map() 和 filter()。>>> # 创建一个 integer 类型的列表

>>> integers = [1, 2, 3, 4, 5]

>>> # 使用 map 创建平方数列表

>>> squares_mapped = list(map(lambda x: x*x, integers))

>>> squares_mapped

[1, 4, 9, 16, 25]

>>> # 使用列表推导式创建平方数列表

>>> squares_listcomp = [x*x for x in integers]

>>> squares_listcomp

[1, 4, 9, 16, 25]

>>> # 使用 filter 取得 integers 中的偶数列表

>>> filtered_filter = list(filter(lambda x: x % 2 == 0, integers))

>>> filtered_filter

[2, 4]

>>> # 使用列表推导式取得 integers 中的偶数列表

>>> filterd_listcomp = [x for x in integers if x % 2 == 0]

>>> filterd_listcomp

[2, 4]

从上面的例子可以看出,使用 list 的某些特性比使用高阶函数更具有可读性,而且也能实现较复杂的嵌套结构。

1.不要忘了定义构造函数

有人认为列表推导式很酷炫,是 Python 特有的功能,所以为了炫耀自己的 Python 水平,即使有更好替代方案也要使用它。>>> # 使用 range 创建列表对象

>>> numbers = [x for x in range(5)]

>>> print(numbers)

[0, 1, 2, 3, 4]

>>> # 以一个字符串为基础,创建一个小写字母的字符列表

>>> letters = [x.lower() for x in 'Smith']

>>> print(letters)

['s', 'm', 'i', 't', 'h']

上述例子中,我们使用了 range 和 string,这两种数据结构都是可迭代的,list()构造函数可以直接使用 iterable 创建一个 list 对象。下面的代码提供了更合理的解决方案。>>> # 使用 range 创建列表对象

>>> numbers = list(range(5))

>>> print(numbers)

[0, 1, 2, 3, 4]

>>> # 以一个字符串为基础,创建一个小写字母的字符列表

>>> letters = list('Smith'.lower())

>>> print(letters)

['s', 'm', 'i', 't', 'h']

2.不要忘了生成器表达式

在 Python 中,生成器是一种特殊的可迭代对象,它会延迟加载元素,直到被请求才会加载。这在处理大量数据时会非常高效,它能提升存储效率。相比之下,list 对象为了方便计数和索引,一次性创建所有的元素。所以跟生成器相比,在元素个数相同时,list 需要占用更多内存。

我们可以定义一个生成器函数来创建生成器。我们也可以使用下面的语句来创建生成器,这是一种称为生成器表达式的方法。(expression for item in iterable)

你可能会注意到,除了使用圆括号外,它的语法跟使用 list 的语句很相似。所以需要注意区分。

考虑下面这个例子。我们要计算前一百万个数字的平方和。如果使用 list 来实现,方法如下。>>> # 创建列表对象 squares

>>> squares = [x*x for x in range(10_000_000)]

>>> # 计算它们的总和

>>> sum(squares)

333333283333335000000

>>> squares.__sizeof__()

81528032如上所示,list 对象占据 81528032 字节。我们考虑使用 generator 进行相同的操作,代码如下。

>>> # 创建 generator 对象,保存每个数的平方数

>>> squares_gen = (x*x for x in range(10_000_000))

>>> # 计算它们的总和

>>> sum(squares_gen)

333333283333335000000

>>> squares_gen.__sizeof__()

96

跟使用 list 相比,使用 generator 内存开销小得多,只有 96 字节。原因很简单———— generator 不需要获取所有的元素。相反,它只需要获取各个元素在序列中的位置,创建下一个元素并呈现它,而且不必保存在内存中。

结论

本文中,我们整理了 list 应用的一些关键要领。这些该做的和不该做的都非常清晰明了。我估计你会在合适的场景中用到它。下面是本文内容的小结。

使用迭代的方式。Python 中有许多类型的 iterable,你应当在掌握基础(list 和 tuple)的同时融会贯通。

使用条件判断语句。如果你对在 iterable 中筛选某些元素感兴趣,可以多多研究条件判断。

使用条件判断表达式。如果你需要有选择性地获取某些数据,可以使用条件判断表达式。

使用嵌套的循环。如果你要处理嵌套的 iterable,可以使用嵌套的循环结构。

用 list 替代高阶函数在很多情况下,可以用 list 替代高阶函数。

不要忘记 list 的构造函数定义 list 的构造函数,可以使用 iterable 创建一个 list 对象。如果你直接使用 iterable,推荐用这个方法。

不要忘了生成器表达式它的语法与 list 中的语法相似。在处理大量的对象时,这是一种节省内存开销的办法。list 和 generator 不同的是,为了日后的索引和访问, list 必须提前创建,如果元素个数很多,就会消耗很大的内存。

python 列表推导_Python 列表推导式使用的注意事项相关推荐

  1. python 列表解析式_python列表解析式,字典解析式,集合解析式和生成器

    一.列表解析式(列表推倒式): 功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表. 1 lst = [1, 3, 5, 8, 10] 2 ll = [x+x for x in ls ...

  2. python字典编码_Python列表,字典,元组,字符串操作,文件操作,字符编码

    1. 列表操作 1.1 列表的定义: names = ["wangjing", "wangjun", "hashiqi"] names[0] ...

  3. python sorted下标_Python列表操作最全面总结

    1.列表添加元素 列表中可以使用append.insert.extend方法实现元素的添加. append会把新元素添加到列表末尾 "a", insert(index, objec ...

  4. python的列表方法_Python列表的常用方法

    一.列表是什么? 列表是由一序列特定顺序排列的元素组成的,可以把字符串.数字.字典等都可以加入列表中. 列表中元素之间没有任何关系,列表也是自带下标的,默认从0开始. 列表是最常用的Python数据类 ...

  5. python定义一个函数列表排序_Python 列表(修改、添加、删除、排序)

    Python的基本数据类型有整数,浮点数,布尔,字符串,它们是最基本的数据.在实际编程中,我们要经常组织由很多基本数据组成的集合,这些集合的不同组织方式就是:数据结构,今天讲的是数据结构中的Pytho ...

  6. python 列表拆分_python列表拆分

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我对python很新,但我遇到了问题. 我有一个看起来像列表的文本文件. 例如: ...

  7. python copy用法_Python 列表 copy() 使用方法及示例

    Python 列表 copy() 使用方法及示例 copy()方法返回列表的浅表副本. 列表可以被复制使用=运算符.例如:old_list = [1, 2, 3] new_list = old_lis ...

  8. python列表去重_python列表去重

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 方法一:利用集合去重 # ! usrbinpython3# -*- coding ...

  9. python列表乘法运算_Python列表基本运算和元组

    成员运算符 in 我们用它来判断指定字符串是否包含某些字符,现在我们用来判断一个元素是否在一个列表中,格式为 元素 in 列表.这是一个布尔表达式,如果元素在列表中,结果为布尔值 True,反之为 F ...

  10. python元组操作_Python 列表和元组操作

    列表: 定义列表: shoppinglist=['car','clother','iphone'] 0 1 2 从列表中将clother取出 shoppinglist[2] 像列表中最后添加 shop ...

最新文章

  1. 计算机二级应用题改卷,全国计算机等级考试二级Python语言程序设计模拟试卷B卷综合应用题-Go语言中文社区...
  2. spring boot(一)创建项目
  3. 数据挖掘-数据预处理的必要性及主要任务
  4. java中常用的并发工具类
  5. Direct2D (35) : 通过 DirectWrite 获取字体列表
  6. llinux环境变量查看和修改
  7. 专访快手传输算法负责人周超博士:LAS标准的推出离不开信念感
  8. jstack 脚本 自动日志_深入理解jstack日志
  9. 只想问你一句:“伤害我,你会心疼吗?”
  10. 背景提取算法——帧间差分法、背景差分法、ViBe算法、ViBe+算法
  11. 解放计算给服务带来的压力,第一想到的就是阿里云高性能计算(HPC)
  12. potplayer视频的倍速设置
  13. word怎么删除不要的页,即刻删除空白页
  14. java多人聊天_java编程实现多人聊天室功能
  15. 错误推测法设计测试用例
  16. 彻底理解js的作用域链
  17. Windows应用商店0x80131500错误
  18. gentoo的USE参数详细说明
  19. win32com为word添加页码(示例)
  20. accept文件上传类型

热门文章

  1. 热敏电阻如何查表计算温度_额温枪温补算法:热电堆温度补偿算法 MTP10B7F55
  2. 通过Server 2019中的组策略部署桌面墙纸 详解组策略环回处理
  3. Fault Tolerance 要求、限制和许可
  4. RabbitMQ学习总结(1)——基础概念详细介绍
  5. 羽枭android,【答疑】Unreal Engine 4 是怎样发布android的? - 视频教程线上学
  6. java中为什么需要常量和变量的区别_Java中常量和最终变量之间的区别?
  7. cpython和jpython_在J内部使用Python
  8. 小白入门angular-cli的第一次旅程(学习目标 学习目标 1. 路由基础知识)补充学习...
  9. composer 安装包时与php版本不符 提示报错
  10. 【读书笔记】周志华《机器学习》第三版课后习题讨第一章-绪论