Python 推导式

推导式

推导式(List Comprehensions)是一种用于创建列表的简洁方式。它们可以看作是列表解析的语法糖,能够快速生成列表,并可以进行更复杂的操作,如过滤、转换等。推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。

Python 支持各种数据结构的推导式:

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式
  • 元组(tuple)推导式
  • 语法格式:
 结果值1 if 判断条件 else 结果值2  for 变量名 in 原列表
  • 1.8.1 列表推导式

[表达式 for 变量 in 列表]

[表达式 for 变量 in 列表 if 条件判断]

实例:对一个列表(names)中的所有字符串进行大小写转换(所有字符串都转换为大写),并且筛选出长度大于3的字符串。以下是实现这个功能的步骤和实现原理:

  1. 使用for循环遍历列表(names)中的每个元素(name)。
  2. 在循环内部,使用if条件筛选出长度大于3的字符串。
  3. 使用upper()方法将字符串转换为大写。
  4. 将筛选后的字符串添加到新的列表(new_names)中。
  5. 循环结束后,新列表(new_names)中包含了所有符合条件的字符串。

实现原理:

  1. 使用列表推导式(list comprehension)来创建新的列表(new_names)。
  2. 列表推导式中的三元操作符(三元操作符是一种简化版的条件表达式)用于判断是否将当前元素添加到新列表中。
  3. upper()方法用于将字符串转换为大写。
  4. 由于列表推导式是根据原始列表(names)中的元素创建新列表(new_names),因此新列表中的元素顺序与原始列表相同。
names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
new_names = [name.upper() for name in names if len(name)>3]
print(new_names)      # 输出结果 ['ALICE', 'JERRY', 'WENDY', 'SMITH']
  • 1.8.2 字典推导式

{ 键: 值 for 键或值 in 数据容器 }

{ 键: 值 for 键或值 in 数据容器 if 条件判断}

实例:将一个列表(list)中的每个元素(字符串)的长度作为值,将该字符串本身作为键,并将它们组成一个字典(my_dict)。

实现原理:

  1. 使用列表推导式(list comprehension)遍历列表(list),并使用len()函数计算每个字符串的长度。
  2. 将计算出的长度值作为键,原始字符串作为值,将它们添加到字典(my_dict)中。
  3. 最后输出字典(my_dict)。

用途: 这个代码 snippet 可以根据给定的列表 list 创建一个字典,其中键是列表中的字符串,值是每个字符串的长度。这对于检查给定的字符串列表中哪个字符串最长或最短非常有用。

list = ['Google','Runoob', 'Taobao']
my_dict = {key:len(key) for key in list}
print(my_dict)     # 输出结果 {'Google': 6, 'Runoob': 6, 'Taobao': 6}
  • 1.8.3 集合推导式

{ 集合 for 键或值 in 数据容器 }

{ 集合 for 键或值 in 数据容器 if 条件判断}

实例:定义了一个名为 my_set 的集合。这个集合是由数字 1, 2, 3 的平方组成的。具体来说,它是使用列表推导式(list comprehension)和集合推导式(set comprehension)来创建一个集合。

实现原理:列表推导式是一种简洁的创建列表的方法,它允许你使用一个表达式和一个迭代器(如序列、range 对象等)来生成一个列表。在这个例子中,i ** 2 是计算平方的表达式,for i in (1, 2, 3) 是迭代器,它从 1 到 3(包括 3,但不包括 4)遍历。所以,列表推导式创建了一个包含 1, 2, 3 的平方数的列表:[1, 4, 9]

集合推导式是一种简洁的创建集合的方法,它允许你使用一个表达式和一个迭代器来生成一个集合。在这个例子中,列表推导式创建了一个包含 1, 4, 9 的集合,并将其赋值给 my_set

my_set = {i ** 2 for i in (1, 2, 3)}
print(my_set)    # 输出结果 {1, 4, 9}
  • 1.8.4 元组推导式(生成器表达式)

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

(表达式 for 变量 in 数据容器)

(表达式 for 变量 in 列表 if 条件判断)

实例:将一个生成器对象转换成元组。生成器对象通常用于迭代操作,而元组是一个不可变的序列,因此在某些情况下,将生成器转换为元组非常有用。具体来说,这段代码首先定义了一个生成器对象 a,它通过使用 (x for x in range(1,10)) 表达式创建。然后,使用 tuple() 函数将 a 转换为元组 b。最后,打印出元组 b 的值。

实现原理:

  1. 使用 (x for x in range(1,10)) 表达式创建一个生成器对象。这个表达式表示通过循环遍历数字 19,每次迭代返回一个数字。
  2. 使用 print(a) 打印生成器对象 a 的值。在这种情况下,它会返回一个类似于 <generator object <genexpr> at 0x7faf6ee20a50> 的字符串,这是生成器对象的内存地址。
  3. 使用 tuple(a) 函数将生成器对象 a 转换为元组 b。在这个例子中,b 将包含数字 19 的列表。
  4. 使用 print(b) 打印元组 b 的值。在这个例子中,它会返回一个元组,例如 (1, 2, 3, 4, 5, 6, 7, 8, 9)
a = (x for x in range(1,10))
print(a)     # 输出结果 <generator object <genexpr> at 0x7faf6ee20a50>
b = tuple(a) 
print(b)     # 输出结果 (1, 2, 3, 4, 5, 6, 7, 8, 9)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值