列表字典推导式
1462 字
7 分钟
列表字典推导式
【一】语法
- 列表推导式可以利用列表,元组,字典,集合等数据类型,快速的生成一个特定需要的列表。
- 语法格式如下
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]【二】列表推导式
【1】为什么要用列表推导式?
- 列表推导式为我们提供了一种从序列创建列表的简单途径,它书写简单,执行效率比循环高。
- 下面我们通过代码直观的感受一下列表推导式的魅力。
(1)直接从序列中构建列表
number_list = []for i in range(5): number_list.append(i)
print(number_list) # [0, 1, 2, 3, 4](2)使用列表推导式
number_list = [i for i in range(5)]print(number_list) # [0, 1, 2, 3, 4]【2】列表推导式的应用
(1)新生成列表的每个元素都可以是任意的表达式或对象
test = [1, 2, 3]
print([i * i for i in test])# [1,4,9]
print([[i, i + 2] for i in test])# [[1,3],[2,4],[3,5]](2)让每个元素执行相同的操作
# 原始列表 : 每个元素都有空格some_animals = [' dog', 'cat ', ' sheep ']
# 列表生成式: 新的列表,每个元素都去除掉了空格some_animals_new = [i.strip() for i in some_animals]print(some_animals_new)# ['dog','cat','sheep'](3)加入嵌套循环
test_1 = [1, 2, 3]test_2 = [4, 5, 6]
# 列表生成式 : 遍历两个列表并取出每一个列表的元素 做乘法运算list_one = [x * y for x in test_1 for y in test_2]print(list_one)# [4,5,6,8,10,12,12,15,18]
# 列表生成式 : 遍历两个列表并取出每一个列表的元素 做新列表的生成list_two = [[x, x + y] for x in test_1 for y in test_2]print(list_two)# [[1, 5], [1, 6], [1, 7], [2, 6], [2, 7], [2, 8], [3, 7], [3, 8], [3, 9]]
### 注意通过这两个print体会谁是内层循环,谁是外层循环
# 列表生成式 : 遍历两个列表并取出每一个列表对应索引的元素 做乘法运算list_three = [test_1[i] * test_2[i] for i in range(len(test_1))]print(list_three)# [4, 10, 18]
# 列表生成式 : 遍历两个列表并取出每一个列表对应索引的元素 做乘法运算list_four = [x * y for x, y in zip(test_1, test_2)]print(list_four)# [4, 10, 18](4)实现行列转换
test = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
list_new = [[row[i] for row in test] for i in range(len(test[0]))]
print(list_new)# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]](5)加入判断条件,组成过滤器
- 从一个给定的列表中选出偶数组成一个新的列表
test = [1, 2, 3, 4, 5, 6]list_one = [x for x in test if x % 2 == 0]print(list_one)# [2, 4, 6]
list_two = list(filter(lambda x: x % 2 == 0, test))print(list_two)# [2, 4, 6]- filter是Python中的一个内嵌函数,它有两个参数,
- 其中第一个参数是一个函数
- 第二个参数是一个迭代器
- 返回值是布尔类型
- 它的作用是将迭代器中的每一个元素都用第一个函数进行判断
- 为真则保留
- 反之则去除
- 从而也形成了过滤的作用。
- 如果此处对lambda表达式有疑惑,不妨可以看看有关函数中对lambda表达式的介绍。
(6)判断列表中有几个对称数
test = [1221, 1234, 12321, 14441, 15672]
list_one = sum([num == num[::-1] for num in map(str, test)])print(list_one)# 3
list_two = len([num for num in map(str, test) if num == num[::-1]])print(list_two)# 3【2】列表生成式
- 只需要将列表推导式中的中括号改成小括号就变成了生成式。
(1)与推导式的区别
- 列表推导式一次性返回所有的元素,生成式每次只会返回一个元素
- 当生成的元素数量非常多时,生成式占用的空间非常小,而推导式则会占用大量的空间
- 推导式的执行效率高,所以推荐在数据量小的时候使用
(2)示例
test = [1, 2, 3]
list_one = (i * i for i in test)print(list_one)# <generator object <genexpr> at 0x0000026B4E6C0D60>
list_two = list(i * i for i in test)print(list_two)# [1, 4, 9]
list_three = ([i, i + 2] for i in test)print(list_three)# <generator object <genexpr> at 0x0000026B4E6C09E0>- 从以上代码我们可以看出生成式的直接返回结果时一个生成器。
- 素数判断
import math
def is_prime(n): if n == 2: return True if n < 2 or n % 2 == 0: return False return all(n % i for i in range(3, int(math.sqrt(n) + 1), 2))
print(is_prime(23))# True【3】字典推导式
- 有了列表推导式的概念,字典推导式学起来就非常简单了,语法格式如下:
{键:值 for 迭代变量 in 可迭代对象 [if 条件表达式]}- 案例
my_dict = {key: value for key in range(3) for value in range(2)}print(my_dict)# {0: 1, 1: 1, 2: 1}- 最常见的哪里还是下述的代码,遍历一个具有键值关系的可迭代对象。
my_tuple_list = [('name', '橡皮擦'), ('age', 18), ('class', 'no1'), ('like', 'python')]my_dict = {key: value for key, value in my_tuple_list}print(my_dict)# {'name': '橡皮擦', 'age': 18, 'class': 'no1', 'like': 'python'}【4】元祖推导式和集合推导式
- 其实你应该能猜到,在 Python 中是具备这两种推导式的,而且语法相信你已经掌握了。不过语法虽然差不多
- 但是元组推导式运行结果却不同,具体如下。
my_tuple = (i for i in range(10))print(my_tuple)# <generator object <genexpr> at 0x000001D17C9B7DD0>- 使用元组推导式生成的结果并不是一个元组,而是一个生成器对象,需要特别注意下
- 这种写法在有的地方会把它叫做生成器语法,不叫做元组推导式。
- 集合推导式也有一个需要注意的地方,先看代码:
my_set = {value for value in 'HelloWorld'}print(my_set)# {'r', 'o', 'W', 'H', 'l', 'd', 'e'}- 因为集合是无序且不重复的,所以会自动去掉重复的元素,并且每次运行显示的顺序不一样,使用的时候很容易晕掉。支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
C 语言发展史
编程语言了解 C 语言从 BCPL、B 语言到现代标准 C 的发展历程、核心特点与应用领域。
2
C 语言开发环境的安装与配置
编程语言在 Windows、Linux 与 macOS 上安装 C 工具链,配置编辑器,并编译运行第一个 C 程序。
3
C 语言初识:程序运行机制与基本结构
编程语言认识 C 程序从源代码到运行的完整流程,以及基础语法和程序的基本结构。
4
C 语言基础:注释、关键字、变量与数据类型
编程语言学习 C 语言的注释、关键字、标识符、常量、变量和基本数据类型等基础知识。
5
C 语言数据类型
编程语言理解 C 语言的数据类型体系,包括基本类型、整数类型、浮点类型和逻辑类型。
随机文章随机推荐














