2017-06-19 1 views
1

Ich habe eine Liste von Listen, in denen jedes Element ein einzelnes Zeichen ist:Verbindungslisten Listen von Strings

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

Daraus ich ['aa','ab','ac','ba','bb','bc','ca','cb','cc'] eine neue Single-Liste mit dem Inhalt generieren möchten. Die einzelnen Elemente jeder Liste werden aneinandergefügt, aber in umgekehrter Reihenfolge der Listen. Ich habe mit diesem kommen (wo np = 2):

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

Meine Lösung muss np höher zu handhaben als nur 2. Ich erwarte, dass diese O (np) ist, was nicht schlecht ist. Kann jemand einen effizienteren und phytonischeren Weg vorschlagen, um das zu tun, was ich will (oder ist das ein guter pythonischer Ansatz)?

Antwort

5

Sie können dies versuchen:

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

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

Ausgang:

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

Für mehr als zwei Elementen:

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)))) 

Ausgang:

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

Oder 'map (''. Join, zip (* ngrams))' für mehr als zwei! – Ryan

+0

Ich denke, Ryan hat was du willst, aber wenn du auch die Reihenfolge der Liste umkehren willst, willst du 'map (''. Join, zip (* reversed (ngram)))' –

+0

Danke Carl, ich gerade benutze einfach das * um ngrams [:: - 1] zu entpacken :-) –

Verwandte Themen