2016-04-25 11 views
0

Ich bin ein Python Anfänger und ich bin auf dieses Problem gestoßen und ich bin mir nicht sicher, wie ich es angehen würde.Zählen, wie oft ein Buchstabe an einer bestimmten Stelle mit Python auftritt

Wenn ich die folgende Sequenz/Strings:

GATCCG

GTACGC

Wie ich die Frequenz jeder Brief an jeder Position auftritt, zählen. ie) G tritt an der Position eins zweimal in den zwei Sequenzen auf, A tritt an der Position 1 auf Null usw.

Jede Hilfe wäre willkommen, danke!

+1

In welchem ​​Format möchten Sie es haben? Könnten Sie uns ein Beispiel wie "{'g': [2, 0, 0, 0, 1, 1], ...}" geben? Ist es das was du willst? – zondo

+0

Ja, ein Wörterbuch wäre gut! – pythonbeginner2506

Antwort

4

Sie können eine Kombination aus defaultdict und enumerate wie so verwenden:

from collections import defaultdict 

sequences = ['GATCCG', 'GTACGC'] 
d = defaultdict(lambda: defaultdict(int)) # d[char][position] = count 
for seq in sequences: 
    for i, char in enumerate(seq): # enum('abc'): [(0,'a'),(1,'b'),(2,'c')] 
     d[char][i] += 1 

d['C'][3] # 2 
d['C'][4] # 1 
d['C'][5] # 1 

Dies baut eine verschachteltes defaultdict, die das Zeichen als erstes und die Position als zweiter Schlüssel nimmt und stellt die Anzahl der Vorkommen des Zeichens in diese Position.

Wenn Sie eine Liste von Positionszählungen wollen:

max_len = max(map(len, sequences)) 
d = defaultdict(lambda: [0]*max_len) # d[char] = [pos0, pos12, ...] 
for seq in sequences: 
    for i, char in enumerate(seq): 
     d[char][i] += 1 

d['G'] # [2, 0, 0, 0, 1, 1] 
+1

Sorry, kannst du erklären, was das macht? – pythonbeginner2506

+0

Oh danke, ich habe eine Ausgabe und ich verstehe es. Ich würde es vorziehen, wenn die Ausgabe etwas mehr wie {'g' aussieht: [2, 0, 0, 0, 1, 1], ...}, ist das überhaupt möglich? – pythonbeginner2506

+1

So. Jetzt sollten Sie abgedeckt sein. Ich denke, die Funktionalität der Defaultdict ist eher intuitiv. – schwobaseggl

0

nicht sicher, dass dies der beste Weg, aber man kann zip verwendet eine Art transponiert auf den Saiten zu tun, Tupel der Buchstaben in jedem produzierenden Position, zum Beispiel:

x = 'GATCCG' 
y = 'GTACGC' 

zipped = zip(x,y) 

print zipped 

als Ausgabe produzieren:

[('G', 'G'), ('A', 'T'), ('T', 'A'), ('C', 'C'), ('C', 'G'), ('G', 'C')] 

Sie von t sehen Er tupelt, dass die ersten Positionen der zwei Strings zwei G enthalten, die zweiten Positionen ein A und ein T, usw. Dann könnten Sie Counter (oder eine andere Methode) verwenden, um zu bekommen, was Sie wollen.

Verwandte Themen