Python推导式
列表推导式
列表推导式主要是用于按照我们指定的内容填充,生成一个新的列表,基本语法如下:
new_list = [expression for item in iterable if condition]
示例
# 生成0~10的一个列表
l = [i for i in range(11)]
print(l) # 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 生成平方数的列表
squares = [x ** 2 for x in range(10)]
print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 生成偶数的列表
even_numbers = [x for x in range(20) if x % 2 == 0]
print(even_numbers) # 输出: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
推导式没有特殊之处,只是一种便利的编程方式....
案例
- 找到嵌套列表中名字含有两个及以上‘a’的所有名字
fruits = [['peach','Lemon','Pear','avocado','cantaloupe','Banana','Grape'],
['raisins','plum','apricot','nectarine','orange','papaya']]
print([name for lst in fruits for name in lst if name.count('a') >= 2])
/
# Output:
['avocado', 'cantaloupe', 'Banana', 'papaya']
- 30以内所有能被3整除的数
multiples = [i for i in range(30) if i % 3 == 0]
print(multiples)
集合推导式
集合推导式用于生成一个新的集合。它的语法与列表推导式类似,但使用大括号 {}
。
new_set = {expression for item in iterable if condition}
示例
# 生成平方数的集合
squares_set = {x ** 2 for x in range(10)}
print(squares_set) # 输出: {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
# 生成唯一的字符集合
unique_chars = {char for char in "hello world"}
print(unique_chars) # 输出: {'h', 'e', 'l', 'o', ' ', 'r', 'w', 'd'}
案例
计算列表中每个值的平方,自带去重功能
l = [1,2,3,4,1,-1,-2,3]
squared = {x**2 for x in l}
print(squared)
# Output:
{16, 1, 4, 9}
字典推导式
同上,我们可以使用字典推导式生成一个新的字典
new_dict = {key_expression: value_expression for item in iterable if condition}
示例
# 生成平方数的字典
squares_dict = {x: x ** 2 for x in range(10)}
print(squares_dict) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
# 生成字符及其 ascii 值的字典
ascii_dict = {char: ord(char) for char in "abc"}
print(ascii_dict) # 输出: {'a': 97, 'b': 98, 'c': 99}
案例
- 将一个字典的key和value对调
dic1 = {'a':1,'b':2}
dic2 = {dic1[k]: k for k in dic1}
print(dic2)
- 合并大小写对应的value值,将k统一成小写
dic1 = {'a':1,'b':2,'y':1, 'A':4,'Y':9}
dic2 = {k.lower():dic1.get(k.lower(),0) + dic1.get(k.upper(),0) for k in dic1.keys()}
print(dic2)
生成器表达式
把列表推导式的的[]
换成()
就变成了生成器表达式,相比于列表表达式,生成器表达式不会直接产生值,而是需要我们手动去迭代它
案例
gen_expr = (x ** 2 for x in range(5))
print(gen_expr)
# Output:
<generator object <genexpr> at 0x...>
手动迭代:
for value in gen_expr:
print(value)
小练一下
使用推导式打印出九九乘法口诀表(仅使用一行代码)
print('\n'.join(['\t'.join([f'{i}x{j}={i * j}' for i in range(1,j+1)]) for j in range(1, 10)]))