2016-12-22 6 views
2

Ich bin ein Anfänger in Python.Extrahieren bestimmter Elemente aus einer Liste von Zeichenfolgen und Erstellen einer neuen Liste?

Das ist mein Problem. Ich habe eine Liste, wie unten

lst = ['UGAGGUAGUAGGUUGUAUAGUU', 'CUAUGCAAUUUUCUACCUUACC', 'UCCCUGAGACCUCAAGUGUGA', 
     'ACACCUGGGCUCUCCGGGUACC', 'CAUACUUCCUUACAUGCCCAUA', 'UGGAAUGUAAAGAAGUAUGUA', 
     'CAUCAAAGCGGUGGUUGAUGUG', 'UAUCACAGCCAGCUUUGAUGUGC', 'AGGCAGUGUGGUUAGCUGGUUG', 
     'ACGGCUACCUUCACUGCCACCC'] 

Jetzt muss ich von allen 10 Elementen in der lst den ersten Buchstaben extrahieren und sie dann in einer neuen Liste. ähnlich der zweite Buchstabe, der dritte Buchstabe usw. bis der letzte Buchstabe aus allen zehn Elementen extrahiert und an die neue Liste angehängt wird. Die Ausgabe wie diese

new_lst = ['UCUACUCUAA', 'GUCCAGAAGC', 'AACAUGUUGG', 'GUCCAACCCG', 'GGUCCAAAAC', 
      'UCGUUUACGU', 'AAAGUGAAUA', 'GAGGCUGGGC', 'UUAGCACCUC', 'AUCCUAGCGU', ..., 'C'] 

aussehen muss ich diesen Code versucht:

new_lst = [] 
new_lst.append(''.join([x[i] for x in lst])) 

Die obigen Code druckt nur die ersten 10 Elemente in der neue_liste, da der Index von 0 bis 9 ist (ich was falsch verstanden Index bedeutet).

Dann habe ich die folgende

final= [] 
for j in range(1,len(lst),1): 
new_lst = [] 
for x in lst: 
    c = len(x) 
    for i in range(1,c,1): 
     while (i<len(x)): 
      new_lst.append(x[i]) 
     else: 
      new_lst.append("") 
final.append([new_lst]) 
print final 

Wenn ich diesen Code ausführen, wirft es einen Speicherfehler. Der Grund, warum ich die Länge überprüft habe, ist, weil die Elemente in der lst nicht von der gleichen Länge sind und wenn ich einen anderen Code verwendete, warf es einen Fehler, IndexError: string index out of range.

Ich wollte zuerst den Code sezieren, so habe ich nur den folgenden Code:

lst2 = [] 
for x in lst: 
c = len (x) 
print c 
    for i in range(0,c,1): 
    print i, 
    print x[i], 

ich die folgende Ausgabe bekommen:

22 
0 U 1 G 2 A 3 G 4 G 5 U 6 A 7 G 8 U 9 A 10 G 11 G 12 U 13 U 14 G 15 U 16  A 17 U 18 A 19 G 20 U 21 U 22 
0 C 1 U 2 A 3 U 4 G 5 C 6 A 7 A 8 U 9 U 10 U 11 U 12 C 13 U 14 A 15 C 16 C 17 U 18 U 19 A 20 C 21 C 21 
0 U 1 C 2 C 3 C 4 U 5 G 6 A 7 G 8 A 9 C 10 C 11 U 12 C 13 A 14 A 15 G 16 U 17 G 18 U 19 G 20 A 22 
0 A 1 C 2 A 3 C 4 C 5 U 6 G 7 G 8 G 9 C 10 U 11 C 12 U 13 C 14 C 15 G 16 G 17 G 18 U 19 A 20 C 21 C 22 
0 C 1 A 2 U 3 A 4 C 5 U 6 U 7 C 8 C 9 U 10 U 11 A 12 C 13 A 14 U 15 G 16 C 17 C 18 C 19 A 20 U 21 A 21 
0 U 1 G 2 G 3 A 4 A 5 U 6 G 7 U 8 A 9 A 10 A 11 G 12 A 13 A 14 G 15 U 16 A 17 U 18 G 19 U 20 A 22 
0 C 1 A 2 U 3 C 4 A 5 A 6 A 7 G 8 C 9 G 10 G 11 U 12 G 13 G 14 U 15 U 16 G 17 A 18 U 19 G 20 U 21 G 23 
0 U 1 A 2 U 3 C 4 A 5 C 6 A 7 G 8 C 9 C 10 A 11 G 12 C 13 U 14 U 15 U 16 G 17 A 18 U 19 G 20 U 21 G 22 C 22 
0 A 1 G 2 G 3 C 4 A 5 G 6 U 7 G 8 U 9 G 10 G 11 U 12 U 13 A 14 G 15 C 16 U 17 G 18 G 19 U 20 U 21 G 22 
0 A 1 C 2 G 3 G 4 C 5 U 6 A 7 C 8 C 9 U 10 U 11 C 12 A 13 C 14 U 15 G 16 C 17 C 18 A 19 C 20 C 21 C 

Wie Sie über die Schleife durch das geht sehen erstes Element, aber nach dem Extrahieren des ersten Zeichens aus dem ersten Element in lst, geht es zum zweiten Zeichen im ersten Element. Aber ich wollte, dass die Schleife durch das zweite Element in der Liste lst geht. Außerdem gibt es Elemente in der Liste mit ungleichen Längen, also fragen Sie sich, ob es eine Möglichkeit gibt, die IndexError: string index out of range zu vermeiden?

Ich denke, ich vermisse etwas, es könnte zu dumm sein. Entschuldigung, naiv zu sein. Wenn Sie bitte verschiedene Methoden vorschlagen könnten, um den Job zu erledigen, wäre es großartig. Ich habe online über die Verwendung von Array aus dem Modul numpy überprüft, aber gibt es eine Möglichkeit, dies ohne zu tun?

Antwort

3

Sie itertools.zip_longest verwenden können

['UCUACUCUAA', 'GUCCAGAAGC', 'AACAUGUUGG', 'GUCCAACCCG', 'GGUCCAAAAC', 'UCGUUUACGU', 'AAAGUGAAUA', 'GAGGCUGGGC', 'UUAGCACCUC', 'AUCCUAGCGU', 'GUCUUAGAGU', 'GUUCAGUGUC', 'UCCUCAGCUA', 'UUACAAGUAC', 'GAACUGUUGU', 'UCGGGUUUCG', 'ACUGCAGGUC', 'UUGGCUAAGC', 'AUUUCGUUGA', 'GAGAAUGGUC', 'UCACUAUUUC', 'UCCAGGGC', 'C'] 

Der eingebaute in zip() und sowie die itertools Methode zip_longest() in Python 3 (oder in Python 2 itertools Methoden izip() und izip_longest()) sind die Werkzeuge der Wahl, wenn Sie zwei oder mehr iterables (wie Listen, Zeichenfolgen oder Generatoren) parallel verarbeiten möchten.Um zu sehen, den Unterschied zwischen zip() und zip_longest() ist folgendes zu beachten:

for chars in zip('ABCD','EFG','HI'): 
    print(chars) 
print('') 
for chars in itertools.zip_longest('ABCD','EFG','HI',fillvalue = ''): 
    print(chars) 

Output:

('A', 'E', 'H') 
('B', 'F', 'I') 

('A', 'E', 'H') 
('B', 'F', 'I') 
('C', 'G', '') 
('D', '', '') 

das erste erzeugte Tupel das Tupel der ersten Elemente ist, erzeugt das zweite Tupel ist das Tupel des zweiten Elemente usw. zip (oder izip) stoppt, sobald das erste iterable erschöpft ist. In diesem Fall kann es kein Tupel des dritten Zeichens in jeder Zeichenkette zurückgeben, da der dritten Eingabe an zip ein drittes Zeichen fehlt. zip_longest() (oder izip_longest()) ermöglicht, dass ein Füllwert die fehlenden Elemente in den kürzeren Iterablen ersetzt, sobald sie erschöpft sind. Hier habe ich die leere Zeichenfolge verwendet, da diese verschwindet, wenn die Tupel durch '' verbunden sind.

Im obigen Code habe ich in 3 Strings zip_longest() fest verdrahtet. Für Ihr Problem müssten Sie explizit 10 Eingaben eingeben, was extrem mühsam wäre, oder Sie verwenden den Entpackungsoperator*. Wenn ich eine Liste haben:

strings = ['ABCD','EFG', 'HI'] 

Dann

for char in itertools.zip_longest(*strings, fillvalue = ''): 

ist Äquivalent zu

for chars in itertools.zip_longest('ABCD','EFG','HI',fillvalue = ''): 
+0

Darn. Beat mich dazu! –

+1

@ juanpa.arrivillaga Manchmal ist Python so einfach, dass es fast nach Betrügereien aussieht. –

+0

Es ist ein Problem, wenn ich andere Sprachen benutzen muss und mein Verstand geht sofort zu "gut, in Python könnte ich einfach' itertools' und ... "verwenden –

1

Sie müssen durch Indizes der längsten Zeichenfolge iterieren:

import itertools 
[''.join(chars) for chars in itertools.zip_longest(*lst,fillvalue = '')] 

Ausgang:

lst = ['UGAGGUAGUAGGUUGUAUAGUU', 'CUAUGCAAUUUUCUACCUUACC', 
     'UCCCUGAGACCUCAAGUGUGA', 'ACACCUGGGCUCUCCGGGUACC', 
     'CAUACUUCCUUACAUGCCCAUA', 'UGGAAUGUAAAGAAGUAUGUA', 
     'CAUCAAAGCGGUGGUUGAUGUG', 'UAUCACAGCCAGCUUUGAUGUGC', 
     'AGGCAGUGUGGUUAGCUGGUUG', 'ACGGCUACCUUCACUGCCACCC'] 

max_len = max(len(x) for x in lst) # length of the longest string 
new_lst = [ ''.join(x[i] for x in lst if i < len(x)) for i in range(max_len)] 
+0

Danke Yevhen :) – rex

Verwandte Themen