推导式
推导式(List Comprehensions
)是一种用于创建列表的简洁方式。它们可以看作是列表解析的语法糖,能够快速生成列表,并可以进行更复杂的操作,如过滤、转换等。推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。
Python 支持各种数据结构的推导式:
- 列表(
list
)推导式 - 字典(
dict
)推导式 - 集合(
set
)推导式 - 元组(
tuple
)推导式 - 语法格式:
结果值1 if 判断条件 else 结果值2 for 变量名 in 原列表
[表达式 for 变量 in 列表]
[表达式 for 变量 in 列表 if 条件判断]
实例:对一个列表(names)中的所有字符串进行大小写转换(所有字符串都转换为大写),并且筛选出长度大于3的字符串。以下是实现这个功能的步骤和实现原理:
- 使用
for
循环遍历列表(names)中的每个元素(name)。 - 在循环内部,使用
if
条件筛选出长度大于3的字符串。 - 使用
upper()
方法将字符串转换为大写。 - 将筛选后的字符串添加到新的列表(new_names)中。
- 循环结束后,新列表(new_names)中包含了所有符合条件的字符串。
实现原理:
- 使用列表推导式(list comprehension)来创建新的列表(new_names)。
- 列表推导式中的三元操作符(三元操作符是一种简化版的条件表达式)用于判断是否将当前元素添加到新列表中。
upper()
方法用于将字符串转换为大写。- 由于列表推导式是根据原始列表(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']
{ 键: 值 for 键或值 in 数据容器 }
{ 键: 值 for 键或值 in 数据容器 if 条件判断}
实例:将一个列表(list
)中的每个元素(字符串)的长度作为值,将该字符串本身作为键,并将它们组成一个字典(my_dict
)。
实现原理:
- 使用列表推导式(
list comprehension
)遍历列表(list
),并使用len()
函数计算每个字符串的长度。 - 将计算出的长度值作为键,原始字符串作为值,将它们添加到字典(
my_dict
)中。 - 最后输出字典(
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}
{ 集合 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}
元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。
(表达式 for 变量 in 数据容器)
(表达式 for 变量 in 列表 if 条件判断)
实例:将一个生成器对象转换成元组。生成器对象通常用于迭代操作,而元组是一个不可变的序列,因此在某些情况下,将生成器转换为元组非常有用。具体来说,这段代码首先定义了一个生成器对象 a
,它通过使用 (x for x in range(1,10))
表达式创建。然后,使用 tuple()
函数将 a
转换为元组 b
。最后,打印出元组 b
的值。
实现原理:
- 使用
(x for x in range(1,10))
表达式创建一个生成器对象。这个表达式表示通过循环遍历数字1
到9
,每次迭代返回一个数字。 - 使用
print(a)
打印生成器对象a
的值。在这种情况下,它会返回一个类似于<generator object <genexpr> at 0x7faf6ee20a50>
的字符串,这是生成器对象的内存地址。 - 使用
tuple(a)
函数将生成器对象a
转换为元组b
。在这个例子中,b
将包含数字1
到9
的列表。 - 使用
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)