转置子列表中的元素

时间:2018-05-23 16:52:07

标签: python list

我有以下列表:

geo=[
[ ['a'],     ['b','c']     ],
[ ['d','e'], ['f','g','h'] ],
[ ['i']                    ]
]

我的目标是获得一个子列表列表:第一个子列表,其中元素位于原始子列表的第一个位置,第二个子列表,元素位于第二个位置,第三个子列表,元素位于第三个位置,等等...换句话说,我需要:

result=[
['a','b','d','f','i'],
['c','e','g'],
['h']
]

请记住,子列表中的元素数量可能会有所不同,子列表中的子列表数也会有所不同。不幸的是我不能使用Pandas或Numpy。

通过zip和Alex Martelli对flatten lists的处理方式,我已经能够获得一个包含第一元素元组的列表,但我无法迭代其余的元件。

result=zip(*[item for sublist in geo for item in sublist])
# [('a', 'b', 'd', 'f', 'i')]

这是我过去4周带领我参与的项目所需要的最后一件事。我差不多完成了。非常感谢你提前。

2 个答案:

答案 0 :(得分:2)

您可以使用itertools.zip_longest(Python2中的izip_longest):

import itertools
l = [[['a'], ['b', 'c']], [['d', 'e'], ['f', 'g', 'h']], [['i']]]
d= [list(filter(lambda x:x is not None, i)) for i in itertools.zip_longest(*[i for b in l for i in b])]
print(d)

输出:

[['a', 'b', 'd', 'f', 'i'], ['c', 'e', 'g'], ['h']]

答案 1 :(得分:1)

你可以这样做:

from itertools import chain

geo = [
[ ['a'],     ['b','c']     ],
[ ['d','e'], ['f','g','h'] ],
[ ['i']                    ]
]
c = list(chain.from_iterable(geo))
result = [[ci[idx] for ci in c if len(ci) > idx] for idx in range(max(map(len, c)))]
print(result)

输出:

[['a', 'b', 'd', 'f', 'i'], ['c', 'e', 'g'], ['h']]