我正在尝试将列表映射为十六进制,然后在其他地方使用该列表。 在python 2.6中,这很简单:
答: Python 2.6:
>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']
但是,在Python 3.1中,以上代码返回一个map对象。
B: Python 3.1:
>>> map(chr, [66, 53, 0, 94])
如何在Python 3.x上检索映射列表(如上面的A所示)?
另外,还有更好的方法吗? 我的初始列表对象大约有45个项目,并且id希望将它们转换为十六进制。
#1楼
您为什么不这样做:
[chr(x) for x in [66,53,0,94]]
#2楼
做这个:
list(map(chr,[66,53,0,94]))
在Python 3+中,许多迭代可迭代对象的进程本身都会返回迭代器。 在大多数情况下,这最终会节省内存,并且应该使处理速度更快。
如果您要做的只是最终遍历此列表,则无需将其转换为列表,因为您仍然可以遍历map对象,如下所示:
# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
print(ch)
#3楼
我对Python 3.1不熟悉,但是可以吗?
[chr(x) for x in [66, 53, 0, 94]]
#4楼
返回列表的地图功能具有保存键入的优点,尤其是在交互式会话期间。 您可以定义返回列表的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]短[str(v) for v in x] 。 您也可以为filter创建类似的功能。
对原始问题有一条评论:
我建议重命名为Geting 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
#5楼
Python 3.5的新功能:
[*map(chr, [66, 53, 0, 94])]
更新
一直在寻找更短的途径,我发现这也行得通:
*map(chr, [66, 53, 0, 94]),
开箱也适用于元组。 注意最后的逗号。 这使其成为1个元素的元组。 也就是说,它等效于(*map(chr, [66, 53, 0, 94]),)
它比带有方括号的版本短一个字符,但我认为最好写,因为您从星号-扩展语法开始,所以我觉得它比较软。 :)