获取一个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%。 批量转换通过bytes
和bytes.decode
然后批量转换回list
保存了大量的工作, 但正如所指出的,只有当你的所有输入都是ASCII序列(或每个字符一个字节的语言环境特定编码,例如latin-1
)。