我有两个清单。
说,
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.只是不太确定如何修复它并获得我想要的输出。
答案 0 :(得分:4)
>>> 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)))]