Python中的列表、元组、字典被称为有序序列,集合被称为无序序列,所以集合不能使用索引访问集合中的元素。无论是有序序列还是无序序列都可以通过推导式生成。
本文简单介绍一下列表、元组、字典(有序序列),以及集合(无序序列)的推导式。感兴趣的小伙伴可以一起阅读下:
一、列表推导式:
说明:列表推导式提供了一种创建列表的简单方法,它由方括号组成,括号中包含一个后跟for子句的表达式,以及零个或多个for子句或if子句。
举列:
# 生成10到100之间的20个随机数
a = [random.randint(10, 100) for n in range(20)]
# 将列表转换为for循环
a = []
for n in range(20):
a.append(random.randint(10, 100))
# 列表a中保留20到50之间的数字,删除其它数字
a = [num for num in a if 20 < num < 50]
# 将列表转换为for循环
a = []
for num in a:
if 20 < num < 50:
a.append(num)
# 生成0到10之间所有数字的平方和立方
a = [(x, x**2, x**3) for x in range(10)]
# 将列表转换为for循环
a = []
for x in range(10):
a.append((x, x ** 2, x ** 3))
# 生成1、2和3的所有唯一组合
a = [(i, j, k) for i in [1, 2, 3] for j in [1, 2, 3] for k in [1, 2, 3] if i !=j and j !=k and k !=i]
# 将列表转换为for循环
a = []
for i in [1, 2, 3]:
for j in [1, 2, 3]:
for k in [1, 2, 3]:
if i != j and j != k and k != i:
a.append((i, j, k))
# 将列表中的列表展开
a = [[1, 2, 3, 4], [5, 6, 7, 8]]
b = [n for ele in arr for n in ele]
# 将列表转换为for循环
b = []
for ele in arr:
for n in ele:
b.append(n)
# 或者使用*操作符在列表中解包一个列表
c = [*arr[0], *arr[1]]
二、元组推导式
根本没有元组推导式。因为元组是不可变的,无法接受赋值。
将列表推导式转变为元组
# 可以使用tuple()函数将列表转换成元组。
# 列表可以是普通的列表。
a = tuple([10, 20, 30, 40, 50])
print(type(a), a)
# 结果:<class 'tuple'> (10, 20, 30, 40, 50)
# 也可以是通过列表推导式生成的列表。
b = tuple([(x, x ** 2, x ** 3) for x in range(10)])
三、集合推导式
与列表推导式一样,集合推导式提供了一种创建集合的简单方法。它由花括号组成,括号中包含一个后跟for子句的表达式,以及零个或多个for或if子句。
举列:
# 生成一个集合,包含0到10之间所有数字的平方
a = {x**2 for x in range(10)}
# 从一个集合中删除20到50之间的所有数字
a = {num for num in a if 20 < num < 50}
四、字典推导式
一般形式:
dict_var = {key:value for (key, value) in dictonary.items()}
举列:
d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
# 获得字典d中每个值的立方
d1 = {k: v**3 for (k, v) in d.items()}
print(d1)
# 获得字典中大于3的值
d2 = {k: v for (k, v) in d.items() if v>3}
print(d2)
# 判断字典中的奇数项和偶数项
d3 = {k: ('Even' if v%2==0 else 'Odd') for (k, v) in d.items()}
print(d3)
总结
推导式是可以从一个数据序列构建另一个新的数据序列的结构体。共有三种推导,列表(list)推导式、集合(set)推导式、字典(dict)推导式。
推导式就是简化代码,但阅读性会变复杂。
因为元组是不可变的,无法接受赋值,所以没有元组推导式。
集合跟列表推导式是类似的,唯一的区别在于它使用大括号{}。