使用列表表达式而不是map和filter


列表表达式 VS map

Python从另一个导出一个列表提供了紧凑的语法。这些表达式被称为是“列表表达式”。例如:你想计算一下列表中每个数字的平方,你就可以使用列表表达式来循环的计算每一项的平方值。

a = [1,2,3,4,5,6,7,8,9,10]
squares = [x*x for x in a]
print(squares)
>>>
[1,4,9,16,25,36,49,64,81,100]

除非你申请一个单参数的函数,列表表达式比内置的map函数更加的简洁,清晰。因为map需要创建一个带有视觉干扰的lambda表达式,来方便计算。

squares = map(lambda x: x **2 ,a)

列表表达式 VS filter

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_rank = {'ghost':1,'habanero':2,'cayenne':3}
rank_dict = {rank:name for name,rank in child_rank.items()}
chile_len_set = {len(name) for name in rank_dict.values()}
print(rand_dict)
print(chile_len_set)
>>>
{1: 'ghost',2: 'habanero',3: 'cayenne'}
{8, 5, 7}

备忘录

  • 列表表达式比内置的map,filter更加清晰,因为map,filter需要额外的lambda表达式的支持。
  • 列表表达式允许你很容易的跳过某些输入值,而一个map没有filter帮助的话就不能完成这一个功能。
  • 字典和集合也都支持列表表达式。

results matching ""

    No results matching ""