2017-06-19 72 views
1

的列表的列表我有一個列表的列表,其中每個元素是單個字符:將字符串連接

ngrams = [['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'], 
['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c']] 

由此,我想生成與內容['aa','ab','ac','ba','bb','bc','ca','cb','cc']一個新的單一列表。每個列表中的各個元素相互追加,但是與列表的順序相反。我想出了這個(其中np = 2):

for cnt in range(np-2,-1,-1): 
    thisngrams[-1] = [a+b for (a,b) in zip(thisngrams[-1],thisngrams[cnt])]   

我的解決方案需要處理np高於僅有2.我希望這是O(NP),這是不壞。有人可以提出一個更有效率和pythonic的方式來做我想做的事(或者這是一種很好的pythonic方法)?

回答

5

你可以試試這個:

ngrams = [['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'], 
['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c']] 

new = map(''.join, zip(*ngrams)) 

輸出:

['aa', 'ba', 'ca', 'ab', 'bb', 'cb', 'ac', 'bc', 'cc'] 

在超過兩個元素:

n = [["a", "b", "c"], ["a", "c", "d"], ["e", "f", "g"]] 

new = map(''.join, zip(* reversed(ngrams))) 

#in Python3 
#new = list(map(''.join, zip(* reversed(ngrams)))) 

輸出:

['eaa', 'fcb', 'gdc'] 
+7

或'map('。join,zip(* ngrams))'超過兩個! – Ryan

+0

我想瑞恩得到了你想要的東西,但是如果你也想扭轉列表的順序,你會想'map('。join,zip(* reversed(ngrams)))' –

+0

謝謝Carl,我只是簡單地用*來解壓ngram [:: - 1] :-) –