我有以下列表:
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周带领我参与的项目所需要的最后一件事。我差不多完成了。非常感谢你提前。
答案 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']]