将值列表提升到值列表列表

时间:2011-12-13 15:20:10

标签: python

这是一个棘手的问题。我想获取一个整数列表,并将其转换为包含该整数的列表列表。这样我以后可以附加到该列表中。很遗憾,list()不会占用一个整数,因此我无法map将其添加到列表中。

这是一个更具体的解释:

鉴于,

>>> a = range(5)
>>> a
[0, 1, 2, 3, 4]

我怎样才能优雅地把它变成,

[[0], [1], [2], [3], [4]]

我尝试了map'list

>>> map(list,a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

tuple相同。事实上,理想情况下我可以映射元组或列表运算符,但当然这对Python的语法不起作用:

>>> map((,),a)
  File "<stdin>", line 1
    map((,),a)
         ^
SyntaxError: invalid syntax

因此,我能提出解决方案的唯一方法是定义自己的列表构造函数:

>>> L = lambda x: [x]
>>> map(L,a)
[[0], [1], [2], [3], [4]]

工作正常,但我想知道是否有更多的Pythonic解决方案。大多数情况下,我很惊讶地发现list(3)没有给[3]

2 个答案:

答案 0 :(得分:9)

我会使用列表理解:

In [1]: a = range(5)

In [2]: [[v] for v in a]
Out[2]: [[0], [1], [2], [3], [4]]

答案 1 :(得分:0)

如果您想要一种将标量转换为列表或元组的一般方法,您可以先将它们转换为返回一个值(标量)的通用迭代,然后使用常规构造函数构造一个列表或元组:

def iterone(scalar):
    yield scalar

scalars = range(5)
iterables = map(iterone, scalars)
lists = map(list, iterables)
tuples = map(tuple, map(iterone, scalars))

虽然@ aix的版本对我来说看起来更像是pythonic。

请注意,这有点奇怪:将map应用于iterables 提升此处的每个迭代器,因此您无法再次使用它。这就是为什么tuples直接重新创建它的原因,实际上分配可迭代名称列表可能容易出错。