这是我的代码:
map(lambda i: 3*i, map(lambda x: x, [[1, 2],[3, 4]]))
输出:[[1, 2, 1, 2, 1, 2], [3, 4, 3, 4, 3, 4]]
如何修改它以打印3, 6, 9, 12
?
我不想使用追加。只是映射和lambda。
答案 0 :(得分:2)
您观察到的问题源于内部map
返回一系列列表,而不是一系列数字。这是因为map
正在迭代包含较小列表的列表。因此,如果您使用itertools.chain.from_iterable
来展平该列表,那么您将获得一系列数字。然后,您可以使用外部map
将它们重复三次
In [67]: L = [[1, 2],[3, 4]]
In [68]: for i in map(lambda i: 3*i, itertools.chain.from_iterable(L)): print(i)
3
6
9
12
答案 1 :(得分:1)
您的代码没有按预期工作,因为在Python中*
运算符是多态的。因此,如果x
和n
是数字,x*n
将返回两个数字的乘积,但是如果其中一个操作数(比如n
)是一个整数而另一个是一个整数sequence(.e。x
是一个列表,一个元组或一个字符串)表达式x*n
返回将x
与自身n
连接起来的序列。例子:
>>> .1 * 2.5
0.25
>>> [1, 2] * 3
[1, 2, 1, 2, 1, 2]
>>> "beep" * 2
beepbeep
为了获得预期的结果,您需要在应用map()
之前将列表展平:
>>> your_list = [[1, 2], [3, 4]]
>>> flat_list = [item for sublist in your_list for item in sublist]
>>> flat_list
[1, 2, 3, 4]
>>> triples = map(lambda x: 3*x, flat_list)
>>> triples
[3, 6, 9, 12]
实际上,您不需要使用map()
和lambda
。我认为使用单行列表理解会更加pythonic:
>>> triples = [3*item for sublist in your_list for item in sublist]
>>> triples
[3, 6, 9, 12]