【发布时间】:2014-01-17 16:57:00
【问题描述】:
我有两个嵌套列表:
ls1 = [["a","b"], ["c","d"]]
ls2 = [["e","f"], ["g","h"]]
我想要以下结果 [(a,e), (b,f), (c,g), (d,h)]
我尝试过 zip(a,b),如何将嵌套列表压缩到包含元组对的列表中?
【问题讨论】:
标签: python list zip nested tuples
我有两个嵌套列表:
ls1 = [["a","b"], ["c","d"]]
ls2 = [["e","f"], ["g","h"]]
我想要以下结果 [(a,e), (b,f), (c,g), (d,h)]
我尝试过 zip(a,b),如何将嵌套列表压缩到包含元组对的列表中?
【问题讨论】:
标签: python list zip nested tuples
您可以在list comprehension 中使用两次zip:
>>> ls1 = [["a","b"], ["c","d"]]
>>> ls2 = [["e","f"], ["g","h"]]
>>> [y for x in zip(ls1, ls2) for y in zip(*x)]
[('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', 'h')]
>>>
【讨论】:
一种惯用的方法是在压缩列表之前使用星号和itertools.chain 将列表展平。星号表示法将可迭代解包为函数的参数,而itertools.chain 函数将其参数中的可迭代链接在一起成为单个可迭代。
ls1 = [["a","b"], ["c","d"]]
ls2 = [["e","f"], ["g","h"]]
import itertools as it
zip(it.chain(*ls1), it.chain(*ls2))
【讨论】:
你需要扁平化你的列表,可以使用reduce:
from functools import reduce # in Python 3.x
from operator import add
zip(reduce(add, ls1), reduce(add, ls2))
【讨论】:
你也可以使用itertools.chain.from_iterable和zip:
>>> ls1 = [["a","b"], ["c","d"]]
>>> ls2 = [["e","f"], ["g","h"]]
>>>
>>> zip(itertools.chain.from_iterable(ls1), itertools.chain.from_iterable(ls2))
[('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', 'h')]
【讨论】:
itertools.chain 而非itertools.chain.from_iterable 会提高可读性。 (是的,我知道from_iterable 版本更快。)
cfi = itertools.chain.from_iterable ;)