我试图映射列表为十六进制,然后在其他地方使用该列表。在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>

如何检索映射表(如在<强> A 上文)上的Python 3.x的?

可替换地,是有这样做的更好的方法?我的初始列表对象有大约45项和ID喜欢将它们转换为十六进制。

有帮助吗?

解决方案

这样做:

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

在Python 3+,该迭代iterables许多过程返回迭代自己。在大多数情况下,这最终节省内存,并应使事情更快。

如果你打算做的是遍历这个名单最终,有没有必要,甚至将其转换为一个列表,因为你仍然可以遍历像这样的map对象:

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

其他提示

你为什么不这样做的:

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

这就是所谓的名单理解。你可以找到大量的信息在谷歌,但这里的链接添加到Python(2.6)在列表解析文档。你可能会更感兴趣的是了Python 3 documenation ,虽然。

新的和整齐在Python 3.5:

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

由于附加启封推广

<强>更新

始终寻求更短的方式,我发现这个也可以工作:

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

启封工作在元组过。注意最后的逗号。这使得1个元件的元组。也就是说,它是等效于(*map(chr, [66, 53, 0, 94]),)

这是通过从列表中,括号中的版本只有一个字符短,但在我看来,更好的去写,因为你开始正前方有星号 - 扩展语法,所以我觉得这是心灵上的柔软。 :)

列表的返回映射函数具有节省打字,特别是在交互式会话的优点。您可以定义lmap功能(在python2的imap的比喻),返回列表:

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

然后调用lmap代替map将做的工作: lmap(str, x)是由5个字符(在这种情况下30%)比list(map(str, x))短,肯定比[str(v) for v in x]短。您可以为filter也建立类似的功能。

有原来的问题的注释:

  

我建议重命名,以获取地图()在Python 3返回一个列表*,因为它适用于所有版本的Python3。有没有办法做到这一点? - meawoppl年01月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]]

老评论更好的可见性:对于“做更好的方式这”一不map完全,如果你的输入被称为是ASCII序,它通常快得多转换为bytes和解码,一拉bytes(list_of_ordinals).decode('ascii')。这可以让你的价值观的str,但如果你需要的可变性等等的list,你可以将其转换(和它仍然是更快)。例如,在微基准ipython转换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)。

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

地图(FUNC,* iterables) - >地图对象      作出这样的计算使用的参数从一个迭代器      每个iterables的。当最短可迭代耗尽停止。

     

“制作一个迭代”

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

  

“计算使用的参数从每个iterables的功能”

表示迭代器的next()函数将每个iterables的一个值和它们中的每传递给该函数的一个定位参数。

所以,如果你的地图()funtion得到一个迭代器,并仅仅指刚将它传递给列表()内置函数或使用列表理解。

在除了上述Python 3答案,我们可以简单地从一个list创建结果值的map作为

li = []
for x in map(chr,[66,53,0,94]):
    li.append(x)

print (li)
>>>['B', '5', '\x00', '^']

我们可以通过我在那里打另一个例子概括,在地图上的操作也可以以类似的方式就像在regex问题的处理,我们可以写函数来获得项目的list映射和获得的结果设置在同一时间。防爆。

b = 'Strings: 1,072, Another String: 474 '
li = []
for x in map(int,map(int, re.findall('\d+', b))):
    li.append(x)

print (li)
>>>[1, 72, 474]

在Python和基本地图功能效用使用列表理解,一个也可以做这样的:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top