为了展平嵌套列表,我总是成功使用列表推导或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
这让我抓狂!我做错了什么?
答案 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)
丑陋,但正式履行要求lambda
和map
:
>>> res = []
>>> list(map(lambda z: res.extend(z), z))
>>> res
[(1, 2), (2, 3), (3, 4), (5, 6), (7, 8), (9, 10)]