这是一个棘手的问题。我想获取一个整数列表,并将其转换为包含该整数的列表列表。这样我以后可以附加到该列表中。很遗憾,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]
。
答案 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
直接重新创建它的原因,实际上分配可迭代名称列表可能容易出错。