获取地图()返回在Python 3.x的列表
-
19-09-2019 - |
题
我试图映射列表为十六进制,然后在其他地方使用该列表。在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%。通过bytes
和bytes.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])]