【Python】 列表推导式、字典推导式、集合推导式、元组推导式

基础知识传送门Python语法基础之列表、元组、字典、集合

列表推导式

语法格式:

  • 变量名=[表达式 for 变量 in 序列或迭代对象] / [输出 for 循环 if 判断]
  1. 输出—生成列表元素的表达式,可以是有返回值的函数
  2. 循环—普通的for循环
  3. 判断—判断条件,在for循环中符合条件才会输出到生成列表中(if 判断可以省略)
>>>a_list=[x**2 for x in range(10)]
>>>print(a_list)
#输出为
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

列表推导式典型应用:

  • 使用列表推导式实现嵌套列表的平铺
  >>>vec=[[1,2,3],[4,5,6],[7,8,9]]
  >>>[num for elem in vec for num in elem]
  [1,2,3,4,5,6,7,8,9]
  • 使用列表推导式实现矩阵转置
>>>matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
>>>[[row[i] for row in matrix] for i in range(4)]
[[1,5,9],[2,6,10],[3,7,11],[4,8,12]]
#也可以用zip函数实现矩阵转置
>>>list(map(list,zip(*matrix)))
[[1,5,9],[2,6,10],[3,7,11],[4,8,12]]
  • 通过判断条件可以实现元素删选过滤
  • 列表推导式支持文件对象迭代
>>>fp=open('...文件绝对路径','r')
>>>print([line for line in fp])
>>>fp.close()

字典推导式

语法格式:

  • 变量名={ 输出 for 循环 if 判断 }
# 因为key是唯一的,所以最后value都是6
>>>dict_a = {key: value for key in 'python' for value in range(7)}
>>>print(dict_a)
 
# 可以根据键来构造值
>>>dict_b = {key: value **2 for value in range(5)}
>>>print(dict_b)
 
# 遍历一个有键值关系的可迭代对象
>>>list_phone = [('HUAWEI', '华为'), ('MI', '小米'), ('OPPO', 'OPPO'), ('VIVO', 'VIVO')]
>>>dict_c = {key: value for key, value in list_phone}
>>>print(dict_c)
#运行结果
{'p': 6, 'y': 6, 't': 6, 'h': 6, 'o': 6, 'n': 6}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
{'HUAWEI': '华为', 'MI': '小米', 'OPPO': 'OPPO', 'VIVO': 'VIVO'}

注:上述字典推导式代码来自Python列表推导式

集合推导式

语法格式:

  • 变量名={ 输出 for 循环 if 判断 }

集合推导式和列表推导式基本相同,但有几点区别:
1.集合推导式使用大括号“{ }”
2.集合推导式返回的是一个集合set
3.返回结果中无重复元素

#列表推导式与集合推导式的对比:
>>>set={x**2 for x in range(10)}
>>>list=[x**2 for x in range(10)]
>>>print(set)
>>>print(list)
{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[Finished in 0.3s]   集合推导式还有一个明显的特点是**无序**

元组推导式/生成器推导式

语法格式:

  • 变量名=( 输出 for 循环 if 判断 )
>>>generator=(x**2 for x in range(10))
>>>print(generator)
<generator object <genexpr> at 0x000001A799D6A048>
>>>print(tuple(generator))
(0, 1, 4, 9, 16, 25, 36, 49, 64, 81)

由于元组属于不可变序列,故元组推导式生成了一个generator。但用tuple函数可以将generator转换为元组。

猜你喜欢

Python map()函数
Python zip() 、zip() 与zip()函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值