python3之 列表生成式

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']
上一篇:200道Java灵魂考题:全部掌握拿下阿里P7腾讯T3.2


下一篇:人人皆知Python功能,你还不了解嘛?