python 推导式(列表推导式、元组推导式、字 典推导式和集合推导式)以及zip 函数及用法(带示例)
一、推导式
概念
推导式(又称解析器),是 Python 独有的一种特性。使用推导式可以快速生成列表、元组、字典以及集合类型的数据,因此推导式又可细分为列表推导式、元组推导式、字典推导式以及集合推导式。
Python 列表推导式
列表推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表。
列表推导式的语法格式如下:
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]
此格式中,[if 条件表达式] 不是必须的,可以使用,也可以省略。
等价于:
for 迭代变量 in 可迭代对象
表达式
示例:
#实现要求计算0~9每个元素得的平方值,然后放到列表里面
#方法一
a1 = [x**2 for x in range(10)]
print("a1:",a1)
#等价于
#方法二
a2 = []
for x in range(10):
a2.append(x**2)
print("a2:",a2)
#可以在列表推导式中添加 if 条件语句
#方法一
a3 = [x**2 for x in range(10) if x%2==0]
print("a3:",a3)
#等价于
#方法二
a4 = []
for x in range(10):
if(x%2==0):
a4.append(x**2)
print("a4:",a4)
运行结果是一致的。
同时推导式也支持多个循环(循环嵌套)
#实现嵌套循环
b1 = [(x,y) for x in range(2) for y in range(3)]
print("b1:",b1)
b2 = []
for x in range(2):
for y in range(3):
b2.append((x,y))
print("b2:",b2)
Python 元组推导式
元组推导式的语法格式如下:
(表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] )
其中,用 [] 括起来的部分,可以使用,也可以省略。
a = (x for x in range(1,10))
print(a)
从上面的执行结果可以看出,使用元组推导式生成的结果并不是一个元组,而是一个生成器对象
生成器:
生成器本质上也是迭代器,以 list 容器为例,在使用该容器迭代一组数据时,必须事先将所有数据存储到容器中,才能开始迭代;而生成器却不同,它可以实现在迭代的同时生成元素。(也就是说,对于可以用某种算法推算得到的多个数据,生成器并不会一次性生成它们,而是什么时候需要,才什么时候生成。)
如果我们想要使用元组推导式获得新元组或新元组中的元素,有以下三种方式:
①使用 tuple() 函数,可以直接将生成器对象转换成元组,例如:
a = (x for x in range(1,10))
print(tuple(a))
② 直接使用 for 循环遍历生成器对象,可以获得各个元素,例如:
a = (x for x in range(1,10))
for i in a:
print(i,end=" ")
③使用 next() 方法遍历生成器对象,也可以获得各个元素,例如:
a = (x for x in range(3))
print(a.__next__())
print(a.__next__())
print(a.__next__())
print("转换后的元组",tuple(a))
注意,无论是使用 for 循环遍历生成器对象,还是使用 next() 方法遍历生成器对象,遍历后原生成器对象将不复存在,这就是遍历后转换原生成器对象却得到空元组的原因。
Python 字典推导式
Python 中,使用字典推导式可以借助列表、元组、字典、集合以及 range 区间,快速生成符合需求的字典。
字典推导式的语法格式如下:
{表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]}
其中,用 [] 括起来的部分,可以使用,也可以省略。
可以看到,和其它推导式的语法格式相比,唯一不同在于,字典推导式用的是大括号{}。
#交换现有字典中各键值对的键和值。
old_dict = {"Tom":24,"Amy":16}
new_dict = {v:k for k,v in old_dict.items()}
print(new_dict)
Python 集合推导式
Python 中,使用集合推导式可以借助列表、元组、字典、集合以及 range 区间,快速生成符合需求的集合。
集合推导式的语法格式和字典推导式完全相同,如下所示:
{ 表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] }
其中,用 [] 括起来的部分,可以使用,也可以省略。
集合推导式和字典推导式的格式完全相同,那么给定一个类似的推导式,如何判断是哪种推导式呢?最简单直接的方式,就是根据表达式进行判断,如果表达式以键值对(key:value)的形式,则证明此推导式是字典推导式;反之,则是集合推导式。
既然生成的是集合,那么其保存的元素必须是唯一的。
tupledemo = (1,1,2,3,4,5,6,6)
new = {x**2 for x in tupledemo if x%2==0}
print(new)
二、zip 函数及用法
1.概念
zip() 函数是 Python 内置函数之一,它可以将多个序列(列表、元组、字典、集合、字符串以及 range() 区间构成的列表)“压缩”成一个 zip 对象。
所谓“压缩”,其实就是将这些序列中对应位置的元素重新组合,生成一个个新的元组。
zip() 函数的语法格式为:
zip(iterable, …)
其中 iterable,… 表示多个列表、元组、字典、集合、字符串,甚至还可以为 range() 区间。
2.用法
my_list = [1,2,3]
my_tuple = (4,5,6)
print([x for x in zip(my_list,my_tuple)])
my_dict = {"Name":"Tom",\
"Sex":"boy",\
"Age":24}
print({x for x in zip(my_dict)})
my_str1 = "Hello"
my_str2 = "Hi"
print([x for x in zip(my_str1,my_str2)])
在使用 zip() 函数“压缩”多个序列时,它会分别取各序
列中第 1 个元素、第 2 个元素、… 第 n 个元素,各自组成新的元组。需要注意的是,当多个序列中元素个数不一致时,会以最短的序列为准进行压缩。
另外,对于 zip() 函数返回的 zip 对象,既可以像上面程序那样,通过遍历提取其存储的元组,也可以向下面程序这样,通过调用 list() 函数将 zip() 对象强制转换成列表:
my_list = [1,2,3]
my_tuple = (4,5,6)
print(list(x for x in zip(my_list,my_tuple)))