使用lambda和map python进行迭代

时间:2016-07-18 19:20:50

标签: python lambda

这是我的代码:

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。

2 个答案:

答案 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中*运算符是多态的。因此,如果xn是数字,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]