pyspark - 使用带有map()的lambda表达式展平嵌套的rdd

时间:2017-01-26 20:29:54

标签: python list lambda list-comprehension

为了展平嵌套列表,我总是成功使用列表推导或itertools.chain.from_iterable。

然而,使用pyspark,我需要通过映射lambda函数来展平(tupples)列表列表,由于某种原因,我无法“转换”这个成功的列表理解:

z = [[(1,2),(2,3),(3,4)],[(5,6),(7,8),(9,10)]]

[(j,k) for sublist in z for j,k in sublist]
[(1, 2), (2, 3), (3, 4), (5, 6), (7, 8), (9, 10)] # right answer

到等效的map / lambda等价物:

list(map(lambda z: [(j,k) for sublist in z for j,k in sublist],z))
TypeError: 'int' object is not iterable

这让我抓狂!我做错了什么?

2 个答案:

答案 0 :(得分:2)

我建议您使用itertools.chain

from itertools import chain

list(chain.from_iterable(z))

或者,您也可以使用sum()作为:

sum(z, [])

但是,如果必须使用 lambda表达式,那么它可以与reduce一起使用:

list(reduce(lambda x, y: x+y, z))

上述每个表达式返回的值为:

[(1, 2), (2, 3), (3, 4), (5, 6), (7, 8), (9, 10)]

答案 1 :(得分:1)

丑陋,但正式履行要求lambdamap

>>> res = []
>>> list(map(lambda z: res.extend(z), z))
>>> res
[(1, 2), (2, 3), (3, 4), (5, 6), (7, 8), (9, 10)]