如何在Python 3中映射两个不同长度的列表?

时间:2017-09-05 21:44:51

标签: python python-3.x list dictionary

我有两个清单。

说,

letterList = [(1, 'a') (1, 'b')]
bigramList = [(2, 'ab'), (2, 'cd'), (2, 'ef')]

我想将两个列表映射到一起以获得此输出:

print(myMap)
# [ ((1, a), (2, ab)), ((1, b), (2, cd)), (None, (2, ef)) ]

我得到的输出是这样的:<map object at 0x7f639461efd0>

我知道我的问题在于这一行:

myMap = (map(None, letterList, biGramList))

我认为这是因为Python 3.只是不太确定如何修复它并获得我想要的输出。

3 个答案:

答案 0 :(得分:4)

使用itertools.zip_longest()

>>> letterList = [(1, 'a'), (1, 'b')]
>>> bigramList = [(2, 'ab'), (2, 'cd'), (2, 'ef')]
>>> list(itertools.zip_longest(letterList, bigramList))
[((1, 'a'), (2, 'ab')), ((1, 'b'), (2, 'cd')), (None, (2, 'ef'))]

请注意,您不一定需要将其强制列入使用它,只是方便打印。

答案 1 :(得分:0)

如果您不允许导入外部模块,那么这可能有所帮助:

result = list(zip(letterList,bigramList))
l1 = len(letterList)
l2 = len(bigramList)
if l1 > l2:
    result += [(item, None) for item in letterList[l2:]]
else:
    result += [(None, item) for item in bigramList[l1:]]
#[((1, 'a'), (2, 'ab')), ((1, 'b'), (2, 'cd')), (None, (2, 'ef'))]

答案 2 :(得分:0)

内联if else可以正常工作 - 但这依赖于从一开始就知道较短的列表

lst = [(1, 'a'), (1, 'b')]
bst = [(2, 'ab'), (2, 'cd'), (2, 'ef')]

[(lst[i] if i < len(lst) else None,
  bst[i])
 for i in range(len(bst))]

Out[30]: [((1, 'a'), (2, 'ab')), ((1, 'b'), (2, 'cd')), (None, (2, 'ef'))]

实际上是一个“单行”列表理解,但有一个换行符,希望提高可读性

编辑:可以推广对称处理输入

[(lst[i] if i < len(lst) else None,
  bst[i] if i < len(bst) else None)
 for i in range(max(len(lst), len(bst)))]