我们一直在使用“map”通过将函数应用于列表的各个元素来构造列表。
Python中存在另一种构造此类列表的方法,称为。这叫做列表理解(list comprehension)。
在将“map”与列表理解进行比较之前,让我们先了解什么是列表理解(list comprehension)。
列表理解是一种比for循环更短、更优雅的列表构造方法。
通过列表理解,您可以随时随地构建一个列表,而无需初始化空列表,然后向其添加值。
让我们使用列表理解构建前10个数字的正方形列表。
squares = [x**2 for x in range(10)] print(squares)
让我们考虑一个 Python 函数,将华氏温度转换为其等效摄氏温度。
我们将把这个函数应用到从不同城市收集的温度列表。
使用map 函数实现:
def fahrenheit_to_celcius(F): C = (F-32)*(5/9) return round(C,4) temp_fahrenheit = [100, 95, 98, 105, 110, 32] temp_celcius = [] temp_celcius_map = list(map(fahrenheit_to_celcius, temp_fahrenheit)) print(f"Temperatures converted using map: {temp_celcius}")
现在让我们替换成列表理解:
def fahrenheit_to_celcius(F): C = (F-32)*(5/9) return round(C,4) temp_fahrenheit = [100, 95, 98, 105, 110, 32] temp_celcius = [fahrenheit_to_celcius(x) for x in temp_fahrenheit] #list comprehension print(f"Temperatures in Fahrenheit: {temp_fahrenheit}") print(f"Temperatures converted to Celcius: {temp_celcius}")
在这个例子中,定义函数 fahrenheit_to_celcius
仍然是使用 map
的常见部分。
但是,如果我们将 map
与 lambda 函数一起考虑,我们也可以使用列表理解来摆脱 lambda。
我们可以使用与 lambda 相同的表达式来构造我们的列表。
让我们使用列表推导重做在数字列表上查找“is_even”的代码。
a = [13, 60, 0, 2, 17, 19] print(f"a = {a}\n") is_even = [True if x%2==0 else False for x in a] print(f"is_even(a) = {is_even}")
因此,我们能够通过单一的列表推导来消除 map
和 lambda
。
就两者之间的比较而言,列表理解是一个比 map
更简洁、语法更直观的选项。
它也被认为是一种比 map
更“Pythonic”的做事方式。
使用列表推导式的另一个优点是我们可以使用它根据某些条件从给定列表中过滤项目
并构造一个长度小于原始列表的列表。
这不是map
的情况,对于输入列表中的每个项目,传递的函数必须返回一个项目。
让我们看一个例子,我们使用列表理解从给定的数字范围中过滤掉 5 的倍数。
multiples_of_5 = [x for x in range(1,31) if x%5==0] print(f"Multiples of 5 from 1 to 30 = {multiples_of_5}")
这对于 map
是不可能的。
如果我们考虑两种方法之间的时间比较,map
的执行速度比列表理解更快。