# Python推导式 ## 列表推导式 列表推导式主要是用于按照我们指定的内容填充,生成一个新的列表,基本语法如下: > new_list = [ expression for item in iterable if condition ] ### 示例 ```python # 生成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] ``` 推导式没有特殊之处,只是一种便利的编程方式.... ### 案例 1. 找到嵌套列表中名字含有两个及以上‘a’的所有名字 ```python 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'] ``` 2. 30以内所有能被3整除的数 ```python multiples = [i for i in range(30) if i % 3 == 0] print(multiples) ``` ## 集合推导式 集合推导式用于生成一个新的集合。它的语法与列表推导式类似,但使用大括号 `{}`。 ```python new_set = {expression for item in iterable if condition} ``` ### 示例 ```python # 生成平方数的集合 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'} ``` ### 案例 计算列表中每个值的平方,自带去重功能 ```python l = [1,2,3,4,1,-1,-2,3] squared = {x**2 for x in l} print(squared) # Output: {16, 1, 4, 9} ``` ## 字典推导式 同上,我们可以使用字典推导式生成一个新的字典 ```python new_dict = {key_expression: value_expression for item in iterable if condition} ``` ### 示例 ```python # 生成平方数的字典 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} ``` ### 案例 1. 将一个字典的key和value对调 ```python dic1 = {'a':1,'b':2} dic2 = {dic1[k]: k for k in dic1} print(dic2) ``` 2. 合并大小写对应的value值,将k统一成小写 ```python 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) ``` ## 生成器表达式 把列表推导式的的`[]`换成`()`就变成了生成器表达式,相比于列表表达式,生成器表达式不会直接产生值,而是需要我们手动去迭代它 ### 案例 ```python gen_expr = (x ** 2 for x in range(5)) print(gen_expr) ``` **手动迭代:** ```python for value in gen_expr: print(value) ``` # 小练一下 使用推导式打印出九九乘法口诀表(仅使用一行代码) ```python print('\n'.join(['\t'.join([f'{i}x{j}={i * j}' for i in range(1,j+1)]) for j in range(1, 10)])) ```