获取一个map()来返回Python 3.x中的一个列表

我试图将一个列表映射到十六进制,然后在别处使用列表。 在Python 2.6中,这很简单:

答: Python 2.6:

>>> map(chr, [66, 53, 0, 94]) ['B', '5', '\x00', '^'] 

但是,在Python 3.1上,上面返回一个地图对象。

B: Python 3.1:

 >>> map(chr, [66, 53, 0, 94]) <map object at 0x00AF5570> 

如何在Python 3.x中检索映射列表(如上面的A )?

或者,有没有更好的方法来做到这一点? 我的初始列表对象有大约45个项目和id喜欢将它们转换为十六进制。

做这个:

 list(map(chr,[66,53,0,94])) 

在Python 3+中,遍历迭代器的许多进程自己返回迭代器。 在大多数情况下,这最终会节省内存,并应该让事情变得更快。

如果你最终要做的就是迭代这个列表,那么就不需要把它转换成列表,因为你仍然可以迭代map对象,如下所示:

 # Prints "ABCD" for ch in map(chr,[65,66,67,68]): print(ch) 

你为什么不这样做:

 [chr(x) for x in [66,53,0,94]] 

这被称为列表理解。 您可以在Google上找到大量的信息,但是这里有关于列表解析的Python(2.6)文档的链接 。 不过,您可能对Python 3文档更感兴趣。

Python 3.5中新的和整洁的:

 [*map(chr, [66, 53, 0, 94])] 

感谢其他解包通用

列表返回地图功能具有保存输入的优点,特别是在交互式会话期间。 你可以定义返回列表的lmap函数(类比python2的imap ):

 lmap = lambda func, *iterable: list(map(func, *iterable) 

然后调用lmap而不是map来完成这个工作: lmap(str, x)list(map(str, x))短5个字符(在这种情况下为30% list(map(str, x)) ,当然比[str(v) for v in x] 。 您也可以为filter创建类似的功能。

对原来的问题有一个评论:

我建议重命名为获取map()返回Python 3中的列表。*适用于所有Python3版本。 有没有办法做到这一点? – meawoppl 1月24日在17:58

可能的,但这是一个非常糟糕的主意。 只是为了好玩,下面是你可能( 但不应该 )这样做的:

 __global_map = map #keep reference to the original map lmap = lambda func, *iterable: list(__global_map(func, *iterable)) # using "map" here will cause infinite recursion map = lmap x = [1, 2, 3] map(str, x) #test map = __global_map #restore the original map and don't do that again map(str, x) #iterator 

我不熟悉Python 3.1,但是这个工作吗?

 [chr(x) for x in [66, 53, 0, 94]] 
 list(map(chr, [66, 53, 0, 94])) 

map(func,* iterables) – > map对象创建一个迭代器,使用来自每个迭代器的参数来计算函数。 当最短的迭代器耗尽时停止。

“做一个迭代器”

意味着它将返回一个迭代器。

“使用来自每个可迭代的参数来计算函数”

意味着迭代器的next()函数将采用每个迭代器的一个值,并将它们中的每一个传递给函数的一个位置参数。

所以你从map()函数得到一个迭代器,然后把它传递给list()内建函数或使用列表推导。

为了更好的可视性转换我的旧评论 :对于一个“更好的方式来做到这一点”没有完全map ,如果你的输入已知是ASCII序列,它通常快速转换为bytes和解码,一个la bytes(list_of_ordinals).decode('ascii') 。 这会给你带来一些价值,但是如果你需要一个可变性或类似的list ,你可以转换它(而且还是更快)。 例如,在ipython microbenchmarks转换45个输入:

 >>> %%timeit -r5 ordinals = list(range(45)) ... list(map(chr, ordinals)) ... 3.91 µs ± 60.2 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each) >>> %%timeit -r5 ordinals = list(range(45)) ... [*map(chr, ordinals)] ... 3.84 µs ± 219 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each) >>> %%timeit -r5 ordinals = list(range(45)) ... [*bytes(ordinals).decode('ascii')] ... 1.43 µs ± 49.7 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each) >>> %%timeit -r5 ordinals = list(range(45)) ... bytes(ordinals).decode('ascii') ... 781 ns ± 15.9 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each) 

如果把它作为一个str ,它将花费最快的map解决方案的20%的时间; 即使转换回列表,它仍然不到最快map解决方案的40%。 批量转换通过bytesbytes.decode然后批量转换回list保存了大量的工作, 正如所指出的,只有当你的所有输入都是ASCII序列(或每个字符一个字节的语言环境特定编码,例如latin-1 )。