下面让我们一起逐一认识一下推导式的结构。
一、列表推导式
1、使用[]生成list
基本格式
new_list = [element for element in old_list if element == 3]
# new_list:新生成的列表
# old_list:原始列表
# element:列表元素
# if element == 3 :原始列表元素满足条件生成新生列表元素
例一:生成一个 1-19 之间能够被 3 整除的列表
In [21]: new_list = [element for element in range(1,20) if element % 3 == 0]
In [22]: new_list
Out[22]: [3, 6, 9, 12, 15, 18]
例二:生成一个 1-9 的 2 倍数列表
In [23]: new_list = [2 * element for element in range(1,10)]
In [24]: new_list
Out[24]: [2, 4, 6, 8, 10, 12, 14, 16, 18]
例三:列表推导式中调用函数(生成一个 1-9 之间偶数的平方的列表)
In [45]: def square(number):
...: return number * number
In [46]: new_list = [ square(element) for element in range (1, 10) if element % 2 == 0]
In [47]: new_list
Out[47]: [4, 16, 36, 64]
2、使用()生成generator
将列表推导式的[]改成()即可得到生成器。
In [52]: multiples = (i for i in range(30) if i % 3 == 0)
In [53]: multiples
Out[53]: at 0x00EC13C0> # 生成一个迭代器
In [54]: for i in multiples:
...: print(i, end = " ")
0 3 6 9 12 15 18 21 24 27
注意:range() 和 xrange() 在python 2 中的区别
# range 会直接生成一个 list 对象,
# xrange 则不会直接生成一个 list,而是每次调用返回其中的一个值,xrange 是一个生成器
二、字典推导式
字典推导和列表推导的使用方法非常相似,区别在于:中括号该改成大括号。
例一:当一个字典的值也为不可变类型且值不存在重复现象时,实现字典的键 值的位置转变
In [58]: old_dict = {"name":"jack", "age":18}
In [59]: new_dict = {value:key for key,value in old_dict.items()}
In [60]: new_dict
Out[60]: {'jack': 'name', 18: 'age'}
例二:字典中的大小写合并为小写并且将大小写的值相加
In [90]: old_dict = {"a": 10, "b": 34, "A": 7, "Z": 3, "B":10}
In [91]: new_dict = {
...: k.lower(): old_dict.get(k.lower(), 0) + old_dict.get(k.upper(), 0)
...: for k in old_dict.keys()
...: if k.lower() in ['a','b']}
In [92]: new_dict
Out[92]: {'a': 17, 'b': 44}
三、集合推导式
它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}。
例一:快速生成一个集合
In [101]: {x for x in range(10)}
Out[101]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
例二:集合推导式使列表变成集合
In [98]: old_list = [1, 4, 1, 5, 2]
In [99]: new_set = {x*2 for x in new_list}
In [100]: new_set
Out[100]: {2, 4, 8, 10}