将字符串连接

问题描述:

的列表的列表我有一个列表的列表,其中每个元素是单个字符:将字符串连接

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方法)?

你可以试试这个:

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] :-) –