Python – 地图与列表理解
假设我们有一个函数,我们想在一行代码中为不同的值计算这个函数。这就是map()函数发挥作用的地方! map()
函数在将给定函数应用于给定可迭代对象(列表、元组等)的每个项目后返回结果的映射对象(它是一个迭代器)
Syntax: map(funcname, iterables)
Parameters:
funcname: It is the name of the function which is already defined and is to be executed for each item.
iterables: It can be list, tuples or any other iterable object.
Return Type: Returns a map object after applying the given function to each item of a given iterable (list, tuple etc.)
例子:
# function to double the number
def num (n) :
return n * 2
lst = [2, 44, 5.5, 6, -7]
# suppose we want to call function
# 'num' for each element of lst,
# we use map
# creates a map object
x = map(num, lst)
print(x)
# returns list
print(list(x))
输出:
注意:有关详细信息,请参阅Python map()函数。
列表理解是 lambda函数、 map()
、 filter()
和reduce()
的替代品。它遵循数学集合构建符号的形式。它提供了一种简洁的方式来创建列表。
句法:
[ expression for item in list if conditional ]
参数:
- 表达式 -基于用于每个元素的变量
- for ..in – 'for' 后跟要使用的变量名,后跟 'in'
- if –过滤
例子:
lst = [2, 44, 5.5, 6, -7]
# to double the number
# list comprehension
x = [i * 2 for i in lst ]
print(x)
输出:
[4, 88, 11.0, 12, -14]
注意:有关详细信息,请参阅Python列表理解和切片。
Map VS List 理解
- 与地图相比,列表理解更简洁,更易于阅读。
- 列表推导允许过滤。在地图上,我们没有这样的设施。例如,要打印 100 范围内的所有偶数,我们可以编写
[n for n in range(100) if n%2 == 0]
。地图中没有替代品 - 当需要结果列表时使用列表推导,因为 map 只返回一个 map 对象并且不返回任何列表。
- 当我们需要评估太长或太复杂而无法表达的表达式时,列表推导比映射更快
- 在调用已定义函数的情况下,映射更快(因为不需要 lambda)。
比较执行时间
注意:我们将使用内置的Python库“
timeit
”。- 没有 lambda
让我们通过一个简单的操作来打印给定范围内的数字。我们一个一个地使用映射和列表理解来执行这个操作。
从上面的示例中,我们可以得出结论,当一个函数已经定义时,map 的性能优于列表推导。 - 在地图中使用 lambda
让我们在 map() 中需要 lambda 的地方进行操作。第一个操作是给给定范围内的每个数字加 2。第二个操作是对给定范围内的每个数字求平方。从上面的代码中,我们可以观察到 map 仍然比列表理解更好。
注意:在某些情况下,在表达式太长且太复杂的情况下,列表推导可以比映射执行得更好。
- 没有 lambda