我可能hashmap
对 Java 和Python 中的map
/感到困惑。
我认为 Java 的(k/v 抽象) 与Python中的相同dict
hash
dict
但是map
数据类型有什么作用呢?
它和 hashmap 抽象是同一个抽象吗?如果是这样,那么它与字典有何不同?
我浏览了文档,但它把我带到了不同的范式:函数式编程。
Map不是 python 中的数据类型。它将函数应用于一系列值并返回结果。
>>> def f(x):
... return x**2
...
>>> list(map(f, range(5)))
[0, 1, 4, 9, 16]
通常对于像“pythonic”这样的简单情况,我们使用列表推导。
>>> [x**2 for x in range(5)]
[0, 1, 4, 9, 16]
您对哈希图和字典的比较是正确的。
本质上Map
,Java 中的 adict
与 Python 中的 a 类似:两种数据结构都在键和值之间创建关联,并且对于get()
andcontains()
操作具有预期的 O(1) 性能。
Java 中的Map
数据结构不应与map()
Python 中的函数混淆:
地图(函数,可迭代,...)
将函数应用于可迭代的每个项目并返回结果列表。如果传递了额外的可迭代参数,则函数必须接受那么多参数并并行应用于所有可迭代的项目
Nolen 的答案是针对 Python 2。
在 Python 3中,map 是一个可迭代的数据类型,相当于 Python 2 中 itertools 的 imap 返回的数据类型。
要在 Python 3 中获得与上面第一个 Python 2 示例相同的结果,您可以编写:
>>> def f(x):
... return x**2
...
>>> list(map(f, range(5)))
[0, 1, 4, 9, 16]
python中没有地图数据类型。map 是将函数映射到序列的函数。
def increment(n):
return n+1
l = [1,2,3]
map(increment, l)
会给你一个新的列表 [2,3,4]
在 Python 3中,map 返回一个可迭代的数据类型,相当于 Python 2 中 itertools 的 imap 返回的数据类型。
要在 Python 3 中获得与Nolan Royalty 的Python 2 示例相同的结果,您可以编写:
>>> def f(x):
... return x**2
...
>>> list(map(f, range(5)))
[0, 1, 4, 9, 16]
如果您不在 Python 3 中将其包装在列表中,您将获得一个地图对象:
>>> map(f, range(5))
... <map object at 0x000000000327E780>
因此,在 Python 3 中有可迭代的地图对象。