在Python 3.x中让map()返回一个列表
我想把一个列表转换成十六进制,然后在其他地方使用这个列表。在Python 2.6中,这个操作很简单:
A: 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个项目,我想把它们转换成十六进制。
11 个回答
123
你为什么不这样做呢:
[chr(x) for x in [66,53,0,94]]
这叫做列表推导式。你可以在谷歌上找到很多相关的信息,不过这里有一份关于列表推导式的Python(2.6)的文档链接。不过你可能更想看看Python 3的文档。
178
在Python 3.5中新增的有趣功能:
[*map(chr, [66, 53, 0, 94])]
这要感谢额外的解包通用化
更新
我总是在寻找更简洁的方法,发现这个方法也可以用:
*map(chr, [66, 53, 0, 94]),
解包在元组中也能使用。注意最后的逗号。这使得它变成了一个包含1个元素的元组。也就是说,它等同于(*map(chr, [66, 53, 0, 94]),)
这个写法比用列表括号的版本少了一个字符,但在我看来,这种写法更好,因为你一开始就用上了星号——解包的语法,所以我觉得这样写起来更轻松。:)
908
这样做:
list(map(chr,[66,53,0,94]))
在Python 3及以上版本中,很多处理可迭代对象的过程会返回迭代器。这样做通常可以节省内存,而且运行速度也会更快。
如果你最终只是想遍历这个列表,其实根本不需要把它转换成列表,因为你仍然可以像这样遍历map
对象:
# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
print(ch)