文章参考:
100天精通Python(基础篇)——第25天:推导式大全_无 羡ღ的博客-CSDN博客
Python 推导式 | 菜鸟教程 (runoob.com)
目录
一, 推导式简单介绍
二,列表推导式
三, 元组推导式
四, 字典推导式
五, 集合推导式
六, 推导式的其它格式
python推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。
python支持的推导式如下:
python列表推导式,又称列表解析式。可以用一种简明扼要的方法来创建列表。
列表推导式的格式:
[表达式 for 变量 in iterable(可迭代对象)]
[out_exp_res for out_exp in input_list]
[表达式 for 变量 in iterable(可迭代对象) if 条件]
[out_exp_res for out_exp in input_list if condition]
格式说明:
列表推导式运行结束后会返回一个新列表。
使用示例1:过滤掉长度小于或等于3的字符串列表,并将得到的字符串转换为大写字母:
names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
new_list = [name.upper() for name in names if len(name)>3]
print(new_list) # 输出结果 ['ALICE', 'JERRY', 'WENDY', 'SMITH']
使用示例2:从输入的字符串中过滤掉小于或等于3的字符串列表,将得到的字符串转换成小写字母,输入的多个字符串之间用空格隔开
new_list = [name.lower() for name in input().split() if len(name)>3] # 输入 TOM JACK JERRY MARY ALICE WENDY
print(new_list) # 输出 ['jack', 'jerry', 'mary', 'alice', 'wendy']
使用示例3:计算30以内可以被3整除的整数,对得到的数据取平方值
new_list = [x*x for x in range(31) if x%3==0]
print(new_list) # 输出 [0, 9, 36, 81, 144, 225, 324, 441, 576, 729, 900]
使用示例4:从嵌套列表中去除偶数
list1 = [[1,2,3],[4,5,6],[7,8,9]]
new_list = [x for y in list1 for x in y if x%2==0]
print(new_list) # 输出 [2, 4, 6, 8]
使用示例5:双遍历字符并相加
new_list = [x+y for x in 'python' for y in '12']
print(new_list) # 输出 ['p1', 'p2', 'y1', 'y2', 't1', 't2', 'h1', 'h2', 'o1', 'o2', 'n1', 'n2']
元组推导式可以利用range区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。
元组推导式的格式和列表类似,不同在于列表使用方括号 [] ,元组使用圆括号 (),且元组推导式返回的是生成器对象,需要使用内置函数tuple()转换成元组。元组推导式的格式:
(表达式 for 变量 in iterable(可迭代对象))
(out_exp_res for out_exp in input_list)
(表达式 for 变量 in iterable(可迭代对象) if 条件)
(out_exp_res for out_exp in input_list if condition)
示例1:不使用tuple()转换,输出的是生成器对象
new_tuple = (x for x in range(31) if x%2==0)
print(new_tuple) #输出 at 0x000001A8738FACF0>
示例2:使用tuple()转换为元组
new_tuple = (x for x in range(31) if x%2==0)
print(tuple(new_tuple)) # 输出 (0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30)
字典推导式的格式与列表推导式格式类似,不同在于字典推导式使用大括号 {},且以键值对的格式输出,列表推导式使用方括号 [];字典推导式的返回值是字典。
字典推导式的格式:
{key:value for value in iterable(可迭代对象)}
{key:value for value in iterable(可迭代对象) if 条件}
使用示例1:以10以内的偶数为键,数字的平方为值
new_dict = {x:x*x for x in range(11) if x%2==0}
print(new_dict) # 输出 {0: 0, 2: 4, 4: 16, 6: 36, 8: 64, 10: 100}
使用示例2: 以输入的字符串为键,以输入的字符串的长度为值
new_dict = {s:len(s) for s in input().split()} # 输入 TOM JACK JERRY MARY ALICE WENDY
print(new_dict) # 输出 {'TOM': 3, 'JACK': 4, 'JERRY': 5, 'MARY': 4, 'ALICE': 5, 'WENDY': 5}
集合是无序,不重复的,所以集合推导式得到的新序列也是无序,不重复的。集合推导式的格式和列表类似,区别在于集合使用大括号 {},列表使用方括号 []。
集合推导式的格式:
{表达式 for 变量 in iterable(可迭代对象)}
{out_exp_res for out_exp in input_list}
{表达式 for 变量 in iterable(可迭代对象) if 条件}
{out_exp_res for out_exp in input_list if condition}
使用示例1:把字符串中的重复的字母去除
new_set = {x for x in 'aaasdfghfdsfg123323'}
print(new_set) # 输出 {'s', '2', 'd', 'f', 'h', 'a', '1', 'g', '3'}
使用示例2:判断不是'abc'的字母并输出
new_set = {x for x in 'abcdsfabdcad' if x not in 'abc'}
print(new_set) # 输出 {'f', 'd', 's'}
python推导式还有如下格式:
result1 if condition else result2 for value in iterable
示例:查找给定的列表中,如果字符串是以字母p开头,转换为title()格式输出,否则转换为大写字母输出
l = ['Python','ipython2','python3']
# 列表推导式
new_list = [word.title() if word.startswith('p') else word.upper() for word in l]
print(new_list)
# 元组推导式
new_tuple = (word.title() if word.startswith('p') else word.upper() for word in l)
print(tuple(new_tuple)) # 输出 ('PYTHON', 'IPYTHON2', 'Python3')
# 集合推导式
new_set = {word.title() if word.startswith('p') else word.upper() for word in l}
print(new_set) # 输出 {'IPYTHON2', 'Python3', 'PYTHON'}
# 字典推导式
new_dict = {word:word.title() if word.startswith('p') else word.upper() for word in l}
print(new_dict) # 输出 {'Python': 'PYTHON', 'ipython2': 'IPYTHON2', 'python3': 'Python3'}