我试图将一个列表映射为十六进制,然后在其他地方使用该列表。在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])
<map object at 0x00AF5570>

如何在Python 3.x上检索映射列表(如上A所示)?

或者,有没有更好的方法来做这件事?我的初始列表对象有大约45项和id想把它们转换为十六进制。


当前回答

您可以通过迭代对象中的每个项并将其存储在不同的变量中来尝试从map对象获取列表。

a = map(chr, [66, 53, 0, 94])
b = [item for item in a]
print(b)
>>>['B', '5', '\x00', '^']

其他回答

在python3中,除了上述答案之外,我们可以简单地从一个映射as创建一个结果值列表

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

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

我们可以通过另一个例子来概括,在map上的操作也可以以类似的方式处理,就像在正则表达式问题中一样,我们可以编写函数来获得map的项列表,同时获得结果集。前女友。

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]

列表返回映射函数具有节省输入的优点,特别是在交互式会话期间。你可以定义lmap函数(类似于python2的imap),返回list:

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

然后调用lmap而不是map将完成工作: Lmap (str, x)比list(map(str, x))短5个字符(在本例中为30%),并且肯定比[str(v) for v in x]短。你也可以为filter创建类似的函数。

对最初的问题有一个评论:

我建议重命名为Getting 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

另一个选项是创建一个快捷方式,返回一个列表:

from functools import reduce
_compose = lambda f, g: lambda *args: f(g(*args))
lmap = reduce(_compose, (list, map))

>>> lmap(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']
list(map(chr, [66, 53, 0, 94]))

Map (func, *iterables)——>映射对象 创建一个迭代器,该迭代器使用的实参计算函数 每个可迭代对象。当最短的可迭代对象耗尽时停止。 "创建迭代器"

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

"使用来自每个可迭代对象的参数计算函数"

意味着迭代器的next()函数将获取每个可迭代对象的一个值,并将每个值传递给函数的一个位置形参。

因此,你从map()函数中获得一个迭代器,并将其传递给list()内置函数或使用列表推导式。

您可以通过迭代对象中的每个项并将其存储在不同的变量中来尝试从map对象获取列表。

a = map(chr, [66, 53, 0, 94])
b = [item for item in a]
print(b)
>>>['B', '5', '\x00', '^']