前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
列表推导式
列表推导式(list comprehension),又称列表解析式,其提供了一种简单的方法来创建列表。
其结果返回的对象一般来说是列表,但该语法也同样适用于字典(dict),集合(set)等一系列可迭代的数据结构。
列表推导式的执行顺序:各语句之间是嵌套关系,左边第二个语句是最外层,依次往右进一层,左边第一条语句是最后一层。
'''
**列表推导式的一种形式**
'''
[ expr for value in collection [if condition] ]
# 其中 expr: 表达式
# value:代表表达式中的变量吧
# collection:范围
# condition:value所需要的满足的条件
范例
在阅读以下内容时,请最好具备Python中关于列表这个基本数据结构的相关知识,下来让我们来看几个例子,来学习一下列表推导式吧!
1.列表推导式
1.1
x = [-4, -2, 0, 2, 4]
y = [a * 2 for a in x] # 该条语句旨在给x中的每个元素均乘以2
print(y)
# 结果:[-8, -4, 0, 4, 8]
我们可以进一步讨论一下,若直接对列表进行乘以2操作会发生什么呢?
经过计算机测试,其结果是这样的,并非是对列表的每一个元素进行乘以2操作,而是简单的复制两次,返回一个长度不同于原来的新列表。
x = [-4, -2, 0, 2, 4]
y = x * 2
print(y)
# 结果: [-4, -2, 0, 2, 4, -4, -2, 0, 2, 4]
下来我们在将其该列表x转化成数组再试试,
import numpy as np # 导入科学计算库
x = [-4, -2, 0, 2, 4]
y = np.array(x) # 将列表x转化为数组形式
print(y)
# 结果: [-4 -2 0 2 4]
y = y * 2 # 对转化的数组进行乘以2操作
print(y)
# 结果: [-8 -4 0 4 8]
可以看到这样就和列表推导式的结果相同了,因此不能通过对列表乘以某个数以达到对每个元素都进行操作的目的。
1.2
x = [i ** 2 for i in range(1, 10)]
print(x)
# 结果:[1, 4, 9, 16, 25, 36, 49, 64, 81]
其相当于下面这样一种表达,
x = [] # 创建一个空的列表
for i in range(1, 10)
y = i ** 2 # 对i进行平方操作,在python中“ ** ”代表次方
x.append(y) # 采用列表的append方法来实现装填吧
print(x)
# 结果:[1, 4, 9, 16, 25, 36, 49, 64, 81]
通过上面的方法,我们就可以直观地看出该列表推导式的含义。
1.3
x = [(i, i ** 2) for i in range(6)]
print(x)
# 结果:[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
1.4
x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]
print(x)
# 结果: [3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99]
上式要表达的意思是从[0, 100)中选出满足:不是2的倍数,是3的倍数的整数,即选择是3的倍数的奇数。
1.5
a = [(i, j) for i in range(0, 3) for j in range(0, 3)]
print(a)
# 结果:[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
由于存在嵌套关系,所以上式等价于以下所述语句,
a = []
for i in range(0, 3):
for j in range(0, 3):
a.append((i, j))
print(a)
# 结果:[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
对于二维列表也有同样操作,
x = [[i, j] for i in range(0, 3) for j in range(0, 3)]
print(x)
# 结果:[[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
x[0][0] = 10
print(x)
# 结果:[[10, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
1.6
a = [(i, j) for i in range(0, 3) if i < 1 for j in range(0, 3) if j > 1]
print(a)
# 结果:[(0, 2)]
和例1.5相同,属于嵌套关系;
2.元组推导式
( expr for value in collection [if condition] )
2.1
a = (x for x in range(10))
print(a)
# <generator object <genexpr> at 0x0000025BE511CC48>
# 此时生成了一个迭代器( python generator object)对象,类似C++中的指针,无法打印出内容
# 通过tuple()转化为一个元组对象即可
print(tuple(a))
# 结果:(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
3. 字典推导式
{ key_expr: value_expr for value in collection [if condition] }
3.1
b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)
# 结果: {0: True, 3: False, 6: True, 9: False}
4.集合推导式
{ expr for value in collection [if condition] }
4.1
c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}
print(c)
# 结果: {1, 2, 3, 4, 5, 6}
5.其他推导式
next(iterator[, default])
# 从迭代器(iterator)返回下一项。
# 主要通过调用__next__()方法来实现的。
# 如果default参数有设置,当下一个元素不存在时,就返回default参数的值,否则抛出异常StopIteration。
5.1
e = (i for i in range(10)) # 此时e为一迭代器对象,类似C++中的指针
print(e)
# <generator object <genexpr> at 0x0000007A0B8D01B0>
print(next(e)) # 0
print(next(e)) # 1
print(next(e, 520)) # 2 由于下一元素存在,继续输出原值2
for each in e:
print(each, end=' ')
# 结果: 3 4 5 6 7 8 9
# 此时迭代器下一个元素不存在若继续输出,则
print(next(e))
# 结果:
---------------------------------------------------------------
StopIteration Traceback (most recent call last) <ipython-input-37-0dc99b6a1209> in <module>
# 计算机会抛出以上错误,若我们给予器默认参数值,则
print(next(e, 520))
# 结果: 520
5.2
s = sum([i for i in range(101)])
print(s)
# 5050
s = sum((i for i in range(101)))
print(s)
# 5050