推导式
列表推导式 字典推导式 集合推导式 生成器推导式
推导式是从一个或者多个迭代器快速简洁地创建数据结构的一种方法,它可以将循环和条件判断结合,避免冗长的代码。
列表推导式
例:创建一个1到6的整数列表。
#利用for循环
num_list = []
for num in range(1,7):
num_list.append(num)
print(num_list)
#返回结果:
[1, 2, 3, 4, 5, 6]
#或者也可以直接range()的返回结果放到列表
num_list = list(range(1,7))
print(num_list)
#返回结果:
[1, 2, 3, 4, 5, 6]
将上面的例子使用列表推导式创建整数列表。
num_list = [num for num in range(1,7)]
print(num_list)
#返回结果:
[1, 2, 3, 4, 5, 6]
在第一行中,第一个num变量为列表生成值,把循环的结果放在列表num_list中,第二个num为循环变量。其中第一个num也可以为表达式,例如:
num_list = [num-1 for num in range(1,7)]
print(num_list)
#返回结果:
[0, 1, 2, 3, 4, 5]
列表加上条件表达式:现在通过列表推导创建1到6之间的偶数列表。
num_list = [num for num in range(1,7) if num % 2 == 0]
print(num_list)
#返回结果:
[2, 4, 6]
定义两个元组rows与cols,使用推导式嵌套循环,将结果赋值给变量cells,使他成为元组(rows,cols)。
rows = range(1,3)
cols = range(1,4)
cells = [(row,col) for row in rows for col in cols]
print(cells)
#返回结果:
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3)]
字典推导式
类似于列表推导,字典推导也有条件判断以及多个for循环迭代语句:
word = 'hello'
str_counts = {letter:word.count(letter) for letter in word}
print(str_counts)
#返回结果:
{'h': 1, 'e': 1, 'l': 2, 'o': 1}
将字符串‘ hello ’中出现的字母进行循环,计算出每个字母在字符串中出现的次数,例子中,‘ l ’在 ‘ hello ’中出现两次,所以上面程序调用两次word.count(letter),实际调用一次就可以计算得到相应的值。下面这个例子可以解决这个小问题。
word = 'hello'
str_counts = {letter:word.count(letter) for letter in set(word)}
print(str_counts)
#返回结果:
{'l': 2, 'h': 1, 'e': 1, 'o': 1}
注意:两个程序运行结果的字母顺序是不一样的。第一个例子,是对字符串进行迭代的,第二个例子是对集合迭代的,集合有自动去重。为什么两次结果的字母(key)顺序不一样呢?因为集合是无序的!
集合推导式
与列表和字典相似:
a_set = {num for num in range(1,7) if num % 2 == 1}
print(a_set)
#返回结果:
{1, 3, 5}
生成器推导式
元组是没有推导式的,如果你认为将列表推导式中的方括号变成圆括号就是元组推导式的话,是错误的,圆括号之间的是生成器推导式,它返回的是生成器对象。
num_thing = (num for num in range(1,7))
print(num_thing)
print(type(num_thing))
print(next(num_thing))
print(next(num_thing))
print(num_thing.__next__())
print(num_thing.__next__())
#返回结果:
<generator object <genexpr> at 0x000001B3CE29C830>
<class 'generator'>
1
2
3
4
生成器表达式与列表推导式几乎相同,区别在于生成器表达式用小括号(),但区别在于,生成器表达式用更少的内存。因为生成器表达式中的元素是按需逐个生成的,而列表推导式是一下子将所有元素生成列表,放到内存中。