列表(list)推导式、字典(dict)推导式、集合(set)推导式、元组(tuple)推导式。列表(list)推导式在上节已经分享过了,考纲里面对其他的没有要求了,但是为了知识的完整性,应大家要求我打算把剩下的补充完整。{key_expression: value_expression for item in iterable if condition}{键表达式: 值表达式 for 临时变量 in 可迭代对象 if 条件表达式}
键表达式:用于生成字典中每个键(key)的表达式,可以是变量、运算或函数调用值表达式for 临时变量 in 可迭代对象:遍历可迭代对象(如列表、元组、字符串等),每次将元素赋值给临时变量if 条件表达式(可选):过滤条件,只有满足条件的元素才会被加入字典
示例1:创建简单字典
# 传统方式numbers = {}for i in range(5): numbers[i] = i * 2print(numbers) # {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}# 使用字典推导式numbers = {i: i * 2 for i in range(5)}print(numbers) # {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
# 将列表元素映射为它们的平方numbers = [1, 2, 3, 4, 5]squares = {x: x**2 for x in numbers}print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}# 使用列表索引作为键fruits = ['apple', 'banana', 'orange', 'grape']fruit_dict = {i: fruit for i, fruit in enumerate(fruits)}print(fruit_dict) # {0: 'apple', 1: 'banana', 2: 'orange', 3: 'grape'}
# 统计字符串中字符出现的次数(简化版)text = "hello world"char_count = {char: text.count(char) forcharinset(text)}print(char_count)# {' ': 1, 'w': 1, 'e': 1, 'd': 1, 'h': 1, 'l': 3, 'o': 2, 'r': 1}
# 只包含偶数的平方numbers = {x: x**2 for x in range(10) if x % 2 == 0}print(numbers) # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
# 创建一个字典,只包含值大于10的项original = {'a': 5, 'b': 12, 'c': 8, 'd': 15, 'e': 3}filtered = {k: v for k, v in original.items() if v > 10}print(filtered) # {'b': 12, 'd': 15}
# 过滤掉键为元音字母且值大于10的项original = {'a': 5, 'b': 12, 'c': 8, 'd': 15, 'e': 20}filtered = {k: v for k, v in original.items() ifnot (k in'aeiou'and v > 10)}print(filtered) # {'a': 5, 'b': 12, 'c': 8, 'd': 15}
{ expression for item inSequence}或{ expression for item inSequenceif conditional }{元素表达式 for 临时变量 in 可迭代对象}
或{元素表达式 for 临时变量 in 可迭代对象 if 条件表达式}# 示例1:生成平方数集合nums = [1, 2, 2, 3, 4]squares = {x**2 for x in nums}# 结果:{1, 4, 9, 16} (注意:2 的平方 4 只出现一次,集合自动去重)# 示例2:过滤偶数并求平方evens_squared = {x**2 for x in range(10) if x % 2 == 0}# 结果:{0, 4, 16, 36, 64}#判断不是 abc 的字母并输出:a = {x for x in 'abracadabra' if x not in 'abc'}
等价的传统写法
# 集合推导式:result = {x**2 for x in nums if x > 0}# 等价于:result = set()for x in nums: if x > 0: result.add(x**2)
(元素表达式 for 临时变量 in 可迭代对象)(元素表达式 for 临时变量 in 可迭代对象 if 条件表达式)
元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [],另外元组推导式返回的结果是一个生成器对象。实际上也可以理解成生成器表达式(Generator Expression),因为Python 中没有“元组推导式”。使用圆括号 () 包裹的推导式会创建生成器对象,而非元组。要生成元组,必须显式调用 tuple() 函数。>>> a = (x for x in range(1,10))>>> a<generator object <genexpr> at 0x7faf6ee20a50> # 返回的是生成器对象>>> tuple(a) # 使用 tuple() 函数,可以直接将生成器对象转换成元组(1, 2, 3, 4, 5, 6, 7, 8, 9)
# 生成器表达式(圆括号)→ 生成器对象gen = (x**2 for x in range(5) if x % 2 == 0)print(type(gen)) # <class 'generator'>print(list(gen)) # [0, 4, 16]# 再次遍历会得到空列表(生成器已耗尽)print(list(gen)) # []# 正确创建元组的方法:用 tuple() 包裹生成器表达式tup = tuple(x**2 for x in range(5) if x % 2 == 0)print(tup) # (0, 4, 16)print(type(tup)) # <class 'tuple'>