在使用推导式的时候优先考虑使用 map 或 filter 生成器推导式除外,因为使用推导式会在内存中保存推导式所生成的新的列表/字典/集合
各种推导式:
- 生成器 -> (生成器所要生成的值 for 元素 in 可迭代对象 if 元素的相关条件)
- 列表 -> [列表所要生成的值 for 元素 in 可迭代对象 if 元素的相关条件]
- 字典 -> {键: 值for 键 in 字典 if 条件}
- 集合 -> {集合所要生成的值for 元素 in 可迭代对象 if 元素的相关条件}
- 没有元组推导式,因为 () 代表的是生成器推导式
1. 列表推导式
- [expression for item in iterable if condition]
- [列表所要生成的值 for 元素 in 可迭代对象 if 元素的相关条件] -> if 判断可加可不加看情况使用
lis = [i for i in range(5)] # [0, 1, 2, 3, 4]
- 例1 10以内所有能被3整除的数
lis = [i for i in range(10) if i % 3 == 0] # [0, 3, 6, 9]
- 例2 30以内所有能被3整除的数的平方
lis = [i * i for i in range(10) if i % 3 == 0] # [0, 9, 36, 81]
- 例3 找到嵌套列表中名字含有两个 'e' 的所有名字
names = [
['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']
]
new_names = [name for i in names for name in i if name.count('e') == 2] # ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
等价于
names = [
['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']
]
new_names = []
for i in names:
for name in i:
if name.count('e') == 2:
new_names.append(name)
2. 字典推导式
- {key: value for key in dict if condition}
- {键: 值 for 键 in 字典 if 条件} -> if 判断可加可不加看情况使用
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
new_dic = {k: dic[k] for k in dic if dic[k] % 2 == 0}
- 例1 将一个字典的key和value对调
dic = {'a': 10, 'b': 20}
new_dic = {dic[k]: k for k in dic} # {10: 'a', 20: 'b'}
- 例2 合并大小写对应的 value 值,将 key 统一成小写
dic = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
new_dic = {k.lower(): (dic.get(k.lower(), 0) + dic.get(k.upper(), 0)) for k in dic} # {'b': 34, 'z': 3, 'a': 17}
3. 集合推导式
- {expression for item in iterable if condition}
- {集合所要生成的值for 元素 in 可迭代对象 if 元素的相关条件}
squared = {x**2 for x in [1, -1, 2]} # {1, 4}
4. 生成器推导式
- (expression for item in iterable if condition)
- (生成器所要生成的值 for 元素 in 可迭代对象 if 元素的相关条件) -> if 判断可加可不加看情况使用
generator = (i for i in range(10) if i % 2 == 0)
for i in generator:
print(i)