概述
列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式。
Python 列表推导式是什么
列表推导式是 Python 语言特有的一种语法结构,也可以看成是 Python 中一种独特的数据处理方式,
它在 Python 中用于 转换 和 过滤 数据。
其语法格式如下所示,其中 [if 条件表达式] 可省略。
变量 = [表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
variable = [out_exp for var in iterable if condition]
下面通过例题来对列表生成式进行深入的理解。
例题1:生成一个由1-10的平方组成的列表
列表元素分别为[1×1,2×2,3×3,......n×n],假设n=10
常规方法
alist = []
for i in range(1, 11):
alist.append(i * i)
print(alist)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
列表生成式
alist = [i * i for i in range(1, 11)]
print(alist)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
例题2:接着上一个需求,要求返回的序列中不存在偶数项
常规方法
alist = []
for i in range(1, 11):
if i % 2 != 0:
alist.append(i * i)
print(alist)
# [1, 9, 25, 49, 81]
列表生成式
alist = [i * i for i in range(1, 11) if i % 2 != 0]
print(alist)
# [1, 9, 25, 49, 81]
例题3:字符串s1='ABC',字符串s2='123',要求:生成序列 A1 A2 A3 B1 B2 B3 C1 C2 C3
常规方法
alist = []
for i in 'ABC':
for j in '123':
alist.append(i + j)
print(alist)
# ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
列表生成式
alist = [i + j for i in 'ABC' for j in '123']
print(alist)
# ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
例题4:将3×3的矩阵alist1转换成一个列表,且使该列表中包含偶数
常规方法
alist1 = [[1,2,3],[4,5,6],[7,8,9]]
alist2 = []
for item1 in alist1:
for item2 in item1:
if item2 % 2 == 0:
alist2.append(item2)
print(alist2)
# [2, 4, 6, 8]
列表生成式
alist1 = [[1,2,3],[4,5,6],[7,8,9]]
alist2 = [item2 for item1 in alist1 for item2 in item1 if item2 % 2 == 0]
print(alist2)
# [2, 4, 6, 8]
例题5:if else 的情况
常规方法
alist = []
for i in range(10):
if i % 2 == 0:
alist.append(i)
else:
alist.append(1)
print(alist)
# [0, 1, 2, 1, 4, 1, 6, 1, 8, 1]
列表生成式
alist = [i if i % 2 == 0 else 1 for i in range(10)]
print(alist)
# [0, 1, 2, 1, 4, 1, 6, 1, 8, 1]
例题6:当我们想要得到需要循环才能实现的内容时:输出1-10的各个数的对应次方的值。1的1次方,2的2次方,3的3次方…
常规方法
for i in range(1, 10):
print(i ** i)
# 1
# 4
# 27
# 256
# 3125
# 46656
# 823543
# 16777216
# 387420489
列表生成式
print([i ** i for i in range(1, 10)])
# [1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489]
例题7:找出1-10之间所有的偶数,并返回一个列表(包含以这个偶数为半径的圆的面积)
常规方法
import math
li = []
for i in range(1, 10):
if i % 2 == 0:
li.append(math.pi * i * i)
print(li)
# [12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676]
列表生成式
import math
print([math.pi * i * i for i in range(1, 10) if i % 2 == 0])
# [12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676]
例题8:现在有一个字典d = {‘手机’: 2000, ‘电脑’: ‘4000’, ‘鼠标’: ‘100’ },如何 以 手机=2000,电脑=4000,鼠标=100的形式展示。
常规方法
d = {'手机': 2000, '电脑': '4000', '鼠标': '100'}
li = []
for k, v in d.items():
li.append(k + "=" + str(v))
print(li)
# ['手机=2000', '电脑=4000', '鼠标=100']
列表生成式
d = {'手机': 2000, '电脑': '4000', '鼠标': '100'}
print([k + "=" + str(v) for k, v in d.items()])
# ['手机=2000', '电脑=4000', '鼠标=100']
例题9:取出所有带a的列表
常规方法
list1 = ['52pojie', 'OVVO', 'asd', 'sdf', 'freg', 'sfag', 'refv', 'aser', 'sdfr']
rs_list = []
for s in list1:
if 'a' in s:
rs_list.append(s)
print(rs_list)
# ['asd', 'sfag', 'aser']
列表生成式
list1 = ['52pojie', 'OVVO', 'asd', 'sdf', 'freg', 'sfag', 'refv', 'aser', 'sdfr']
list2 = [x for x in list1 if 'a' in x]
print(list2)
# ['asd', 'sfag', 'aser']
例题10:多重循环
常规方法
k = []
for i in range(4):
for j in range(2):
k.append((i, j))
print(k)
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)]
列表生成式
print([(i, j) for i in range(4) for j in range(2)])
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)]
例题11:求a~d能组成的所有两字符的字符串
常规方法
li = []
for x in range(97, 101):
for y in range(97, 101):
li.append(chr(x) + chr(y))
print(li)
# ['aa', 'ab', 'ac', 'ad', 'ba', 'bb', 'bc', 'bd', 'ca', 'cb', 'cc', 'cd', 'da', 'db', 'dc', 'dd']
列表生成式
result = [chr(x) + chr(y) for x in range(97, 101) for y in range(97, 101)]
print(result)
# ['aa', 'ab', 'ac', 'ad', 'ba', 'bb', 'bc', 'bd', 'ca', 'cb', 'cc', 'cd', 'da', 'db', 'dc', 'dd']
例题12:列表推导式可以实现矩阵的转置
常规方法
a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
li = []
for i in range(4):
l2 = []
for row in a:
l2.append(row[i])
li.append(l2)
print(li)
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
列表生成式
a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
at = [[row[i] for row in a] for i in range(4)]
print(at)
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
例题13:【自己动手】画Love组成的心型代码
好了,通过以上的例子你应该对列表生成式有了大致的了解,请把以下【列表生成式】语法改成【常规方法】并发到评论区
print('\n'.join([''.join([('OVVO'[(x-y) % len('OVVO')]if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ')for x in range(-30, 30)])for y in range(30, -30, -1)]))