我有一个列表列表,其中每个元素都是一个字符:
ngrams = [['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'],
['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c']]
Run Code Online (Sandbox Code Playgroud)
由此,我想生成一个包含内容的新单个列表['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])]
Run Code Online (Sandbox Code Playgroud)
我的解决方案需要处理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))
Run Code Online (Sandbox Code Playgroud)
输出:
['aa', 'ba', 'ca', 'ab', 'bb', 'cb', 'ac', 'bc', 'cc']
Run Code Online (Sandbox Code Playgroud)
对于两个以上的元素:
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))))
Run Code Online (Sandbox Code Playgroud)
输出:
['eaa', 'fcb', 'gdc']
Run Code Online (Sandbox Code Playgroud)