python提供了一种精练的写法,可以根据一份列表来制作另外一份。这种表达式称为list comprehension(列表推导)。例如,要用列表中每个元素的平方值构建成另一份列表。如果采用列表推导式来实现,那么就是如下这样的:
a = [1,2,3,4,5,6,7,8,9,10]
squares = [x**2 for x in a]
print(squares)
除非是调用只有一个参数的函数,否则,对于简单的情况来说,列表推导要比内置的map函数更清晰。在这个例子中,如果使用map,那就要创建lammbda函数,以便计算新列表中各个元素的值,这会使代码看起来有些乱。
squares = map(lambda x:x**2,a)
print(list(squares))
列表推导不像map那么复杂,它可以直接过滤原列表中的元素,使得生成的新列表不会包含对应的计算结果。例如,在计算平方值时,我们只想计算那些可以为2所整除的数。如果采用列表推导来做,那么只需在循环后面添加条件表达式即可:
even_squares = [x**2 for x in a if x %2 == 0]
print(even_squares)
输出结果:
[4, 16, 36, 64, 100]
使用内置的filter函数与map结合起来,也能达到同样的效果,但是代码会写的非常难懂。
alt = map(lambda x:x**2,filter(lambda x:x%2 == 0,a))
assert even_squares == list(alt)
字典与集合,也有和列表类似的推导机制,编写算法时,可以通过这些推导机制来创建衍生的数据结构。
chile_ranks = {'ghost':1, 'habanero':2, 'cayenne':3}
rank_dict = {rank:name for name,rank in chile_ranks.items()} # 把字典反过来
chile_len_set = {len(name) for name in rank_dict.values()}
print(rank_dict)
print(chile_len_set)
输出结果:
{1: 'ghost', 2: 'habanero', 3: 'cayenne'}
{8, 5, 7}
要点:
- 列表推导要比内置的map和filter函数清晰,因为它无需额外编写lambda表达式。
- 列表推导可以路过输入列表中的某些元素,如果改用map来做,那就必须辅以filter方能实现。
- 字典与集也支持推导表达式。