python3之 列表生成式
一、什么是“列表生成式”?
列表生成式:是Python内置的非常简单却又非常强大的可以用来创建List 的生成式。
(一)基本格式:
① 不带筛选条件:
[表达式 for 变量 in 序列]
②带筛选条件(放在for 后面, if 是一个筛选条件,不能带else):
[表达式 for 变量 in 序列 if 条件]
③带if… else表达式(放在for 前面, 必须带else):
[表达式 if ··· else ··· for 变量 in 序列]
需要注意的点:
①表达式里的变量名必须和 for 后面的变量 一致;
②列表生成式的首尾括号为[]中括号;
③数值过大的时候,会造成死机;
(二)缺陷:当列表生成式的数值非常大时,会出现运行缓慢,内存不足,若足够大,将造成计算机死机。
那实际上它是什么呢?下面我们就一步步来揭晓。
二、举例子
(1)要生成一个列表 L = [1, 2, 3, 4, 5] ,我们可以用学过的内置方法 list(range(1, 6)) 来生成。
L = list(range(1, 6))
print(L)
输出的结果:
[1, 2, 3, 4, 5]
(2)那如果我们要生成列表 L = [11, 22, 33, 44, 5*5] ,那么我们可以怎么做呢?
首先,我们能想到的第一种方法就是用循环。
# 首先先定义一个列表 [1, 2, 3, 4, 5],可以用range(1, 6) 来生成.
# 定义一个空列表
L = []
for i in range(1, 6):
L.append(i*i)
print(L)
输出的结果:
[1, 4, 9, 16, 25]
那如果不用循环的方式呢?这时候就需要我们的“列表生成式” 闪耀登场了。
只需要一行语句,就可以代替循环,大大减少了代码量。
# 方式二:列表生成式
L = [i*i for i in range(1, 6)]
print(L)
输出的结果:
[1, 4, 9, 16, 25]
(3)在(2)的基础上,再想筛选出range(1, 6) 中,偶数的平方,那么如何做呢?
# 筛选出range(1, 6) 中仅偶数的平方
L = [i*i for i in range(1, 6) if i % 2 == 0]
print(L)
输出的结果:
[4, 16]
(4)如果想要range(1, 6),遇到奇数的时候返回负数,遇到偶数的时候返回原数,那又该怎么实现呢?
# 实现range(1, 6),遇到奇数的时候返回负数,遇到偶数的时候返回原数
L = [i if i % 2 == 0 else -i for i in range(1, 6)]
print(L)
输出的结果:
[-1, 2, -3, 4, -5]
(5)如何使用 列表生成式 实现双层循环,生成 全排列呢?
# 实现双层循环,生成 全排列
L = [n+m for n in "ABC" for m in "xyz"]
print(L)
输出的结果:
['Ax', 'Ay', 'Az', 'Bx', 'By', 'Bz', 'Cx', 'Cy', 'Cz']
(6)列出当前目录下的所有文件和目录名。
# 列出当前目录下所有文件和目录名
import os # 导入os模块
L = [i for i in os.listdir(".")] # os.listdir() 可以列出文件和目录
print(L)
输出的结果:
['__init__.py', '列表生成式.py']
(7)将列表中的字符串都转换成小写。
# 将列表中所有的字符串都变成小写
L = ['Banana', 'Orange', 'Strawberry', 'Apple']
print([s.lower() for s in L])
输出的结果:
['banana', 'orange', 'strawberry', 'apple']
如果列表中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错。
# 如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错
L = ['Banana', 'Orange', 'Strawberry', 'Apple', 123, None]
print([s.lower() for s in L])
输出结果:
AttributeError: 'int' object has no attribute 'lower'
那么,在这里我们就需要加一个判断是否是字符串了,当是字符串的时候再执行lower()方法。
L = ['Banana', 'Orange', 'Strawberry', 'Apple', 123, None]
print([s.lower() for s in L if isinstance(s, str) is True]) # isinstance(s, str) 可以判断一个变量是否是字符串
输出结果:
['banana', 'orange', 'strawberry', 'apple']
如果还想把非字符串的也放在列表中,那么可以用if…else方式
。
L = ['Banana', 'Orange', 'Strawberry', 'Apple', 123, None]
print([s.lower() if isinstance(s, str) is True else s for s in L])
输出结果:
['banana', 'orange', 'strawberry', 'apple', 123, None]
(7)现在有一个字典d = {‘手机’: 2000, ‘电脑’: ‘4000’, ‘鼠标’: ‘100’ },如何 以 手机=2000,电脑=4000,鼠标=100的形式展示。
方法一: 用for循环
d = {'手机': 2000, '电脑': '4000', '鼠标': '100'}
for k, v in d.items():
print(k+"="+str(v))
输出结果:
手机=2000
电脑=4000
鼠标=100
方法二:用列表生成式
d = {'手机': 2000, '电脑': '4000', '鼠标': '100'}
print([k+"="+str(v) for k, v in d.items()])
输出结果:
['手机=2000', '电脑=4000', '鼠标=100']