<python学习笔记>:推导式

141 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

1️⃣理解

  • 推导式就是从一个数据对象中构建另一个数据对象的一种数据处理方式,所以又称解析式。

下面来看看各种数据结构的推导式。


2️⃣列表推导式

  • 列表推导式就是对可迭代对象中的元素进行遍历与过滤,找到满足条件的元素并生成一个新列表。

🟥格式一

语法:

[表达式 for 循环]

比如下面这个例子:

  • 我们想将列表n的元素都扩大2倍,那么可以利用for循环来实现。
>>>n = list(range(1,11))
>>>n
   [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>m = []
>>>for i in n:
        m.append(i*2)
...    
>>>m
   [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
  • 但我们也可以用列表推导式实现

代码如下:

>>>n = list(range(1,11))
>>>m = [i*2 for i in n]
>>>m
   [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

🟨格式二

  • 在列表推导式中,for循环时可以嵌套的。
  • 也就是说,列表推导式可以有多个for语句

语法:

[表达式 for循环 for循环 ...]
  • 比如下面这个例子:
>>>n = [[1,2,3], [4,5,6]]
>>>m = []
>>>for i in n:
     for j in i:
       m.append(j*2)
...        
>>>m
   [2, 4, 6, 8, 10, 12]
  • 我们用列表推导式实现如下:
>>>n = [[1,2,3], [4,5,6]]
>>>m = [j*2 for i in n for j in i]
>>>m
   [2, 4, 6, 8, 10, 12]

🟩格式三

  • 我们也可以在for循环后面加上if语句来进一步过滤掉一些不满足条件的元素

语法:

[表达式 for 循环 if 语句]
  • 比如在下面这个例子中,我们想求出列表中正数的平方
>>>n = [-3,5,2,-4,1]
>>>m = [i**2 for i in n if i > 0]
>>>m
   [25, 4, 1]

🟦格式四

  • 我们还可以加上if--else语句来进一步过滤

比如我们**想求出列表正数中,偶数的平方,奇数的立方,**我们可以这样做:

>>>n = [-3, 5, 2, -4, 1]
>>>m = [i**2 if i%2==0 else i**3 for i in n if i > 0]
>>>m
   [125, 4, 1]

🟪格式五

  • 在列表推导式中,可以使用函数来过滤可迭代对象中的元素。

  • 比如,我们想求将列表中偶数的平方,奇数的立方组成一个新列表,在列表推导式中利用函数,我们可以这样做:

>>>def func(n):
      if n % 2 == 0:
          return n**2
      else:
          return n**3
...
>>>n = [2,3,4,5,6]
>>>m = [func(i) for i in n]
>>>m
   [4, 27, 16, 125, 36]

3️⃣生成器推导式

🟥格式

  • 需要注意的是,元组没有推导式
  • 用小括号()括起来的推导式实际上返回的是一个生成器
  • 这就是生成器推导式
  • 生成器对象可以通过for循环或者__next__方法,next()函数进行遍历,访问生成器对象的元素
  • 生成器对象也可以转换为元组或列表

🟩实例

>>>m = (i for i in range(1,6))
>>>m
   <generator object <genexpr> at 0x000002853FBF3E60>
>>>tuple(m)
   (1, 2, 3, 4, 5)

4️⃣字典推导式

🟥格式

  • 类似的,和列表推导式一样,字典推导式的语法也差不多,不同在于,字典推导式需要用大括号括起来{}
  • 在大括号内需要两个表达式,一个生成键,一个生成值
  • 表达式之间用冒号:隔开

🟩实例

💡例1

>>>m1=['t1', 't2', 't3']
>>>m2=['勇士', '骑士', '热火']
>>>m = {i : j for i, j in zip(m1,m2)}
>>>m
   {'t1': '勇士', 't2': '骑士', 't3': '热火'}

💡例2

>>>m1 = ['张三', '李四', '王五', '赵六']
>>>m2 = [94, 78, 89, 99]
>>>m  = {i : j for i, j in zip(m1,m2)}
>>>m
   {'张三': 94, '李四': 78, '王五': 89, '赵六': 99}

💡例3

>>>n = {'张三': 94, '李四': 78, '王五': 89, '赵六': 99}
>>>m = {i : j for i, j in n.items() if j > 90}
>>>m
   {'张三': 94, '赵六': 99}

5️⃣集合推导式

🟥格式

  • 集合推导式和列表推导式的语法一样,不同点在于,列表推导式用[]括起来,而集合推导式用{}括起来
  • { 表达式/函数 for value1 in 可迭代对象 if 条件}
  • 当然,集合推导式中也可以有多个for循环
  • 需要注意的是,不要忘了,集合的特点:无序性和唯一性

🟩实例

>>>m = (1,2,5,2,4,6,3,5,2)
>>>c_list = [i**2 for i in m]
>>>c_set = {i**2 for i in m}
>>>c_list
   [1, 4, 25, 4, 16, 36, 9, 25, 4]
>>>c_set
   {1, 4, 36, 9, 16, 25}

写在最后

好了,今天的笔记就到这里,欢迎大家到评论区一起讨论!