python中的推导式相关

Python推导式(Comprehensions)是一种非常方便的数据结构,能够从一个数据集合中构建出另一个新的数据集合。在Python中,常见的推导式有列表推导式、字典推导式、集合推导式、元组推导式等几种。

列表推导式

列表推导式可以快速生成一个满足指定需求的列表,其语法格式如下:

[expression for item in iterable if condition]
  • expression:表达式,用于定义列表项的计算方法。

  • item:循环变量,每次循环从iterable中取出一个元素。

  • iterable:可迭代对象,如列表、元组、字符串等。

  • condition(可选):循环条件,用于筛选满足条件的元素。

在这个语法中,我们首先需要定义一个expression表达式,它决定了列表项的计算方法。然后,根据item循环变量,遍历iterable可迭代对象中的每个元素,将每个元素带入expression中进行计算,得到一个新的值,最终生成一个新的列表。如果需要筛选满足condition条件的元素,可以在for之后添加一个if语句进行筛选。

  1. 生成一个包含1到10的整数列表

num_list = [i for i in range(1, 11)]
print(num_list)   # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

这个例子中,我们使用range()函数生成一个从1到10的整数序列,然后将每个元素带入表达式i中进行计算,最终生成一个包含1到10的整数列表。

  1. 生成一个包含1到10以内所有奇数的列表

odd_num_list = [i for i in range(1, 11) if i % 2 == 1]
print(odd_num_list)   # [1, 3, 5, 7, 9]

这个例子中,我们同样使用range()函数生成一个从1到10的整数序列,但在往新的列表中添加元素的时候,加了一个条件判断,即只有当元素是奇数时才加入到新的列表中。

  1. 将一个字符串中的每个字母分别转换成大写字母,并生成一个新的列表

str1 = "hello world"
upper_list = [s.upper() for s in str1]
print(upper_list)   # ['H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D']

这个例子中,我们将一个字符串中的每个字母分别转换成大写字母,并生成一个新的列表。

集合推导式

集合推导式(set comprehensions)是Python中一种通过简洁的表达式来生成集合对象的方式,它与列表推导式非常类似。使用集合推导式可以快速、方便地创建集合对象,并自动去重。集合推导式的基本语法如下所示:

new_set = {expression for item in iterable if condition}
  • expression表示要对每个元素进行的操作或计算,

  • item是对可迭代对象iterable中的每个元素进行循环遍历的变量,

  • condition用于筛选满足条件的元素(可选)。

  • 最终使用大括号{}将表达式和变量括起来,表示生成一个集合。

  • 需要注意的是,集合是无序不重复的元素集合。

下面是一些使用集合推导式的示例:

# 生成集合 {1, 2, 3, 4, 5}
new_set1 = {i for i in range(1, 6)}

# 生成集合 {2, 4, 6, 8, 10}
new_set2 = {i * 2 for i in range(1, 6)}

# 生成集合 {1, 9, 25}
num_list = [1, 2, 3, 4, 5]
new_set3 = {i ** 2 for i in num_list if i % 2 == 1}
  • 在第一个示例中,我们使用range()函数生成从1到5的整数序列,然后将每个元素带入集合表达式i中进行操作,最终生成一个包含1到5的集合。

  • 在第二个示例中,我们同样使用range()函数生成从1到5的整数序列,但是将每个元素乘以2之后放入集合中,最终生成一个包含2、4、6、8和10的集合。

  • 在第三个示例中,我们首先定义了一个整数列表num_list,然后使用集合推导式将列表中所有奇数求平方并生成一个新的集合。

  • 总之,集合推导式是一种快速、方便的生成集合对象的方式。与列表推导式一样,它可以让代码更加简洁易读,并提高编码效率。

元组推导式

元组推导式(tuple comprehension)是Python中一种快速、简洁地创建元组对象的方式,与列表推导式和集合推导式非常相似。使用元组推导式可以从一个或多个迭代器中快速简单地创建元组对象,并且可以将循环和条件判断结合起来。

元组推导式的基本语法如下所示:

new_tuple = (expression for item in iterable if condition)
  • expression表示要对每个元素进行的操作或计算,

  • item是对可迭代对象iterable中的每个元素进行循环遍历的变量,

  • condition用于筛选满足条件的元素(可选)。

  • 最终使用小括号()将表达式和变量括起来,表示生成一个元组。

  • 需要注意的是元组是不可修改的序列。

下面是一些使用元组推导式的示例:

# 生成元组 (1, 2, 3, 4, 5)
new_tuple1 = tuple(i for i in range(1, 6))

# 生成元组 ("apple", "orange", "banana")
fruit_list = ["apple", "orange", "pineapple", "banana", "kiwi"]
new_tuple2 = tuple(fruit for fruit in fruit_list if len(fruit) <= 6)
  • 在第一个示例中,我们使用range()函数生成从1到5的整数序列,然后将每个元素带入元组表达式i中进行操作,最终生成一个包含1到5的元组。

  • 在第二个示例中,我们首先定义了一个水果列表fruit_list,然后使用元组推导式将列表中长度小于等于6的水果生成一个新的元组。

  • 可以看到,元组推导式和列表推导式、集合推导式语法非常类似,只是用小括号来表示生成的数据类型。

  • 需要注意的是,元组推导式返回的结果是一个生成器对象,不是元组对象,如果需要将生成器转换为元组,需要使用tuple()函数进行转换。

字典推导式

字典推导式(dictionary comprehension)是Python中一种方便、快速地创建字典的方式,它可以从一个或多个可迭代对象中生成字典,并且可以使用循环和条件语句来过滤和转换键值对。字典推导式的基本语法如下所示:

new_dict = {key_expression: value_expression for item in iterable if condition}
  • key_expression表示用来生成字典键的表达式,

  • value_expression表示用来生成字典值的表达式,

  • item是对可迭代对象iterable中的每个元素进行循环遍历的变量,

  • condition用于筛选满足条件的元素(可选)。

  • 最终使用大括号{}将表达式和变量括起来,表示生成一个字典。需要注意的是,字典是由唯一的键和对应的值组成的散列表。

下面是一些使用字典推导式的示例:

# 生成字典 {1: "apple", 2: "banana", 3: "orange"}
fruit_list = ["apple", "banana", "orange"]
new_dict1 = {i: fruit for i, fruit in enumerate(fruit_list, start=1)}

# 生成字典 {"odd": [1, 3, 5], "even": [2, 4, 6]}
num_list = [1, 2, 3, 4, 5, 6]
new_dict2 = {"odd" if num % 2 == 1 else "even": [num for num in num_list if num % 2 == (1 if key == "odd" else 0)] for key in ["odd", "even"]}
  • 在第一个示例中,我们使用enumerate()函数将水果列表中的每个元素与其下标配对,并使用start参数指定起始下标为1。然后,将生成的每个键值对带入字典表达式中,最终生成一个包含1到3这3个水果的字典。

  • 在第二个示例中,我们首先定义了一个包含6个整数的列表num_list,然后使用字典推导式将列表中的奇偶数分别放入"odd""even"两个键中,并将奇偶数分别存储于列表中。

  1. 首先,定义了一个包含6个整数的列表num_list,其中包含了1至6的所有数字。

  2. 接着,在字典推导式中,使用for循环对列表["odd", "even"]中的每个元素进行遍历,将其带入字典表达式中生成键。当遍历到"odd"时,如果列表中的元素为奇数,则生成键"odd";否则如果列表中的元素为偶数,则生成键"even"。

  3. 在生成键之后,使用内部表达式[num for num in num_list if num % 2 == (1 if key == "odd" else 0)]来生成键对应的值。这里使用了一个列表推导式,先对num_list中的每个元素进行遍历,然后通过条件判断表达式num % 2 == (1 if key == "odd" else 0)来筛选出符合条件的元素(即奇数或偶数),并将其存储在一个列表中。最终,该列表作为字典的值被生成。

  4. 最终,所有的键值对被组合在一起,形成一个字典对象。在本例中,生成的字典为{"odd": [1, 3, 5], "even": [2, 4, 6]}

从这些示例中可以看出,字典推导式为开发者提供了一种方便、快速地创建字典的方式。通过使用字典推导式,可以让代码变得更加简洁明了,并且提高编写代码的效率。