Python中的推导式

本文深入探讨Python中列表、字典及集合推导式的使用技巧,包括多重循环、条件判断、函数调用等,通过实例展示如何高效生成数据结构。

Python中的推导式

python的推导式包括列表推导式、集合推导式、字典推导式。

一、列表推导式

(一)格式:

[expr for value in collection ifcondition]
如下代码块:

result = []  
 for value in collection:  
     if condition:  
         result.append(expression)  
(二)例子

1、list = [Expresion for var in range]

>>> newlist = [x for x in range(1,10)]
>>> newlist
[1, 2, 3, 4, 5, 6, 7, 8, 9]

2 、根据已经list产生新的列表

>>> newlist
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> nlist = [x*x for x in newlist]
>>> nlist
[1, 4, 9, 16, 25, 36, 49, 64, 81]

3、带条件的列表推导式

>>> nlist
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> nl =[x+2 for x in nlist if x>20]
>>> nl
[27, 38, 51, 66, 83]

4、生成二维的列表
例1:

>>> nl
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> nl2 = [[x,x*2] for x in nl if x > 5]
>>> nl2
[[6, 12], [7, 14], [8, 16], [9, 18]]

例2:

>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b =[a[i][i] for i in range(len(a))]
>>> b
[1, 5, 9]

例3:求矩阵的和

>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b
[[5, 10, 15], [20, 25, 30], [35, 40, 45]]
>>> d = [[a[r][c]+b[r][c]  for c in range(3)] for r in range(3)]
>>> d
[[6, 12, 18], [24, 30, 36], [42, 48, 54]]

5、推导式也可调用函数

>>> fruit
['  banana', '  loganberry ', 'passion fruit  ']
>>> freshf = [f.strip() for f in fruit]
>>> freshf
['banana', 'loganberry', 'passion fruit']

6、使用多重循环(嵌套)
例1:

>>> t1 = [2, 4, 5]
>>> t2 = [1, 3, 7]
>>> t3 = [x * y for x in t1 for y in t2]
>>> t3
[2, 6, 14, 4, 12, 28, 5, 15, 35]
>>> t4 =[t1[i] * t2[i] for i in range(len(t1))]
>>> t4
[2, 12, 35]

例2:

>>> t1
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
>>> t2 = [j  for i in t1 if len(i) > 1 for j in i if j% 2 ==0]
>>> t2
[2, 4, 6, 8]

7、使用紧凑if_else表达式
注意要把if_else看作一个表达式

>>> t1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> t2 = [i if i>5 else 0 for i in t1]
>>> t2
[0, 0, 0, 0, 0, 0, 6, 7, 8, 9]

8、生成元组

(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表
 >>> a=[(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]
>>> a
[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

二、字典推导式

1、常用形式
例1

>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b = {x:x**2 for x in a if x>5}
>>> b
{6: 36, 7: 49, 8: 64, 9: 81}

例2:

>>> a=[1,2,3]
>>> d = {k:v for k,v in enumerate(a)}
>>> d
{0: 1, 1: 2, 2: 3} 

三、集合推导式

合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。

### Python 列表推导式与普通 `for` 循环的区别 #### 性能差异 列表推导式的性能通常优于普通的 `for` 循环。这是因为列表推导式在底层实现上更加优化,减少了函数调用开销以及上下文切换的时间消耗[^1]。此外,在 CPython 实现中,列表推导式被编译成更高效的内部操作序列,从而提升了运行速度。 以下是两者的简单对比测试代码: ```python import timeit # 使用普通 for 循环构建列表 def normal_loop(): result = [] for i in range(10000): if i % 2 == 0: result.append(i * i) return result # 使用列表推导式构建相同列表 def list_comprehension(): return [i * i for i in range(10000) if i % 2 == 0] # 测试执行时间 time_normal = timeit.timeit(normal_loop, number=1000) time_list_comp = timeit.timeit(list_comprehension, number=1000) print(f"Normal loop execution time: {time_normal:.6f} seconds") # 输出正常循环耗时 print(f"List comprehension execution time: {time_list_comp:.6f} seconds") # 输出列表推导式耗时 ``` 通过上述代码可以看出,大多数情况下列表推导式的执行效率更高[^2]。 #### 可读性和简洁性 从可读性的角度来看,当逻辑较为复杂时,普通 `for` 循环可能更容易理解,因为它允许逐步分解复杂的条件判断过程。然而对于简单的过滤或映射操作来说,列表推导式因其紧凑的一行表达形式而显得更为直观和优雅[^3]。 例如,要生成一个由平方数组成的新列表: - **普通 For 循环** ```python squares = [] for num in numbers: squares.append(num ** 2) ``` - **列表推导式** ```python squares = [num ** 2 for num in numbers] ``` 显然第二种写法更加精炼易懂。 #### 嵌套结构处理能力 两者都可以很好地支持嵌套循环的情况。但是需要注意的是,随着层数增加,列表推导式的语法可能会变得难以阅读维护;此时采用传统的多层嵌套 `for` 结构反而更具优势。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值