2017-09-05 59 views
1

我有兩個列表。如何在Python 3中映射兩個不同長度的列表?

說,

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.只是不太確定如何解決它並獲得我想要的輸出。

+1

「...如何解決它,並得到我想要的輸出」並輸入一個例子... – alfasin

+1

如果你知道問題出現在'myMap =(map(None,letterList,biGramList))'中,那麼發佈'letterList'和'biGramList'的樣本值,並且不要發佈任何東西其他。我們對看到不相關的代碼並不感興趣。 – DyZ

+0

輸入例: 谷歌 兩個 輸出:作爲格式顯示... [((LetterFreq1,Letter1),(BiGramFreq1,BiGram1)),((LetterFreq2,Letter2),(BiGramFreq2,BiGram2)),(( ,...,())等...] – John

回答

3

使用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'))] 

注意,你不一定需要將其強制到一個列表中使用它,它是印刷只是方便。

+0

除了正則表達式之外,我不能爲本練習導入任何東西。 – John

+0

@John編程的第一個規律是:忽略所有不適當的限制,因爲你的老闆總是比你笨。 – o11c

+2

@ o11c編程課程的第一條法則:不要忽視教授施加的限制。 – DyZ

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'))] 
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)))] 
相關問題