Python(列表推导式、元组推导式、字典推导式和集合推导式)

推导式(又称解析器),是 Python 独有的一种特性。使用推导式可以快速生成列表、元组、字典以及集合类型的数据,因此推导式又可细分为列表推导式、元组推导式、字典推导式以及集合推导式。

Python列表推导式

列表推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表。

列表推导式的语法格式如下:

variable = [out_exp for out_exp in input_list if out_exp == 2]

  • out_exp_res:列表生成元素表达式,可以是有返回值的函数。
  • for out_exp in input_list:迭代input_list将out_exp传入out_exp_res表达式中。
  • if out_exp == 2:根据条件过滤哪些值可以。
dd_list = []
for x in range(5):
   for y in range(4):
       dd_list.append((x, y))

上面代码中,x 是遍历 range(5) 的迭代变量(计数器),因此该 x 可迭代 5 次;y 是遍历 range(4) 的计数器,因此该 y 可迭代 4 次。因此,该(x,y)表达式一共会迭代 20 次。上面的 for 表达式相当于如下嵌套循环:

d_list = [(x, y) for x in range(5) for y in range(4)]
# d_list列表包含20个元素
print(d_list)

运行上面代码,可以看到如下输出结果:

[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]

print ( [x*y for x in range(2,13,2) for y in range(3,14,2) if  (x*y) % 3 and (x*y) %5 == 0 ] )

上述代码:找出偶数与奇数相乘的积,即能被3整除又能被5整除的数。
运行结果:

[30, 50, 70, 90, 110, 130]

Python元组推导式

元组推导式的语法格式如下:

(表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] )

元组推导式和列表推导式的用法完全相同。

例如,我们可以使用下面的代码生成一个包含数字 1~10中奇数 的元组:

a = (x for x in range(1,112))
print(a)

运行结果为:

<generator object <genexpr> at 0x0000025BC1161048>

从运行结果可以看出,使用元组推导式生成的结果并不是一个元组,而是一个生成器对象,这一点和列表推导式是不同的。

如果我们想要使用元组推导式获得新元组或新元组中的元素,有以下三种方式:

1. 使用 tuple() 函数,可以直接将生成器对象转换成元组,例如:

a = (x for x in range(1,112))
print(tuple(a))

运行结果为:

(1, 3, 5, 7, 9)

2. 直接使用 for 循环遍历生成器对象,可以获得各个元素,例如:

a = (x for x in range(1,112))
for i in a:
    print(i,end=' ')
print(tuple(a))

运行结果为:

1 3 5 7 9 ()

3. 使用 next() 方法遍历生成器对象,也可以获得各个元素,例如:

```python
a = (x for x in range(3))
print(a.__next__())
print(a.__next__())
print(a.__next__())
a = tuple(a)


print("转换后的元组:",a)

运行结果为:

0
1
2
转换后的元组: ()

注意,无论是使用 for 循环遍历生成器 对象,还是使用 next() 方法遍历生成器对象,遍历后原生成器对象将不复存在,这就是遍历后转换原生成器对象却得到空元组的原因。

Python字典推导式

字典推导式的语法格式如下:

variable = {out_exp for out_exp in input_list if out_exp == 2}

和其它推导式的语法格式相比,唯一不同在于,字典推导式用的是大括号{}。

例1.

listdomn = ('你好','世界')
newlist = {key : vlaue  for key,vlaue in listdomn}
print(newlist)

运行结果为:

{'你': '好', '世': '界'}

例2. 交换现有字典中各键值对的键和值。

olddict={'今天写多少了': 5, 'www.xiaobai.com': 15}
newdict = {v: k for k, v in olddict.items()}
print(newdict)

运行结果为:

{5: '今天写多少了', 15: 'www.xiaobai.com'}

例 3. 使用 if 表达式筛选符合条件的键值对。

olddict={'今天写多少了': 5, 'www.xiaobai.com': 15}
newdict = {v: k for k, v in olddict.items() if v > 8}
print(newdict)

运行结果为:

{15: 'www.xiaobai.com'}

Python集合推导式

集合推导式的语法格式和字典推导式完全相同,如下所示:

{ 表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] }

由于集合推导式与字典推导式相同,如何区分是那种推导式呢?
最简单的方法是,根据表达式进行判断。如果表达式以键值对(key:value)的形式,则证明此推导式是字典推导式;反之,则是集合推导式。

例1. 既然生成的是集合,那么其保存的元素必须是唯一的。

tupledemo = (1,1,2,3,4,5,6,6)
setnew = {x**2 for x in tupledemo if x%2==0}
print(setnew)

运行结果为:

{16, 4, 36}

例子2. 取出字典中的键,组成新的集合。

dictdemo = {'1':1,'2':2,'3':3}
setnew = {x for x in dictdemo.keys()}
print(setnew)

运行结果为:

{'2', '1', '3'}
  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值