在使用推导式的时候优先考虑使用 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)