Seite 1 von 1
% zahlen aus liste
Verfasst: Montag 29. November 2010, 15:02
von menace
hi leute, ich habe da ein kleines problem
ich soll aus einer raw_input liste die anzahl an elementen herauslesen welche a, c, g oder t sind (DNA-Strang)
ich hab bereits eine kleinere Lösung gemacht aber habe da das problem, dass mein DNA stück genau 10 zeichen haben muss. und dass die Programmierung doch ehere langwiirig ist. könnt ihr mir vielleicht nen kleinen schubs in die richtige richtung geben?
ich post soweis schonmal was ich habe um zu zeigen wo mein problem liegt:
Code: Alles auswählen
lista = []
list_ = "caagttagca"
if list_[0] == "a":
lista.append(1)
if list_[1] == "a":
lista.append(1)
if list_[2] == "a":
lista.append(1)
if list_[3] == "a":
lista.append(1)
if list_[4] == "a":
lista.append(1)
if list_[5] == "a":
lista.append(1)
if list_[6] == "a":
lista.append(1)
if list_[7] == "a":
lista.append(1)
if list_[8] == "a":
lista.append(1)
if list_[9] == "a":
lista.append(1)
a = len(lista)
prozenta = 100*(a/(a))
print a
print "A:", prozenta, "%"
print lista
das ist nur für a und nur für 10 zeichen. ich will garnicht wissen wieviele stufen es für 4 buchstaben und etwa 25 Basenpaaren geben würde :/
greez menace
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 15:13
von ntrunk
Hi,
reicht ein kleiner Hinweis zu einem kleinen Problem?

Dann schau dir mal die Methode count des String-Objektes an.
Gruß
Norbert
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 15:17
von EyDu
Oder allgemein:
Code: Alles auswählen
>>> import collections
>>> data = "caagtagcaspamandegs"
>>> d = collections.defaultdict(int)
>>> for x in data:
... d[x] += 1
...
>>> d
defaultdict(<type 'int'>, {'a': 6, 'c': 2, 'e': 1, 'd': 1, 'g': 3, 'm': 1, 'n': 1, 'p': 1, 's': 2, 't': 1})
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 15:25
von menace
ich habe eine lösung mit dem count-hinweis bekommen. was haltet ihr vom folgendem:
Code: Alles auswählen
sequenz = raw_input("Schreibe DNA-Sequenz:")
a = 0
for char in sequenz:
if char == "a":
a = int(a + 1)
c = 0
for char in sequenz:
if char == "c":
c = int(c + 1)
g = 0
for char in sequenz:
if char == "g":
g = int(g + 1)
t = 0
for char in sequenz:
if char == "t":
t = int(t + 1)
ich hab mal die nachfolgenden berechnungen rausgelassen. aber ich find das behebt mein problem grösstenteils.
ich muss ich halt noch schauen, wie ich es schaffen soll dass bei grösseren anzahlen an c,g,t und as nicht plötzlich die zusammengerechneten prozentzahlen 98 geben oder so.
tipps dafür? ^^
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 15:29
von numerix
Code: Alles auswählen
>>> data = "caccctgtgtgcaactttgacaca"
>>> dict(zip("acgt",map(data.count,"acgt")))
{'a': 6, 'c': 8, 't': 6, 'g': 4}
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 15:37
von menace
ahh, ne noch nettere lösung

darum mag ich das forum, man sieht immer wie mans auch noch machen kann!
als was sind die a und c etc. jetzt gespeichert? als int wert? als liste? hab die aufzählungsart noch nie gesehn
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 15:39
von Xynon1
Dictionary mit String als Key und Integer als Value.
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 15:44
von menace
hm.. das heisst dann also dass man somit zwar die zählung leichter macht aber dann die weiterrechnung mit den werten eher schwieriger oder?
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 15:48
von EyDu
menace hat geschrieben:hm.. das heisst dann also dass man somit zwar die zählung leichter macht aber dann die weiterrechnung mit den werten eher schwieriger oder?
Nein, das bedeutet, dass du unbedingt das
Tutorial durcharbeiten solltest.
Sebastian
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 15:52
von Xynon1
Du kannst a,c,g,t doch einfach zuorndnen.
Code: Alles auswählen
>>> data = "caccctgtgtgcaactttgacaca"
>>> acgt = adict(zip("acgt",map(data.count,"acgt")))
>>>
>>> a = acgt["a"]
>>> b = acgt["b"]
>>> c = acgt["c"]
>>> d = acgt["d"]
Aber EyDu hat völlig recht wenn du nicht weißt was eine Dictionary ist, solltest du dringend die Grundlagen lernen.
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 16:04
von menace
ich hab jetzt noch eine kleine Visualisierung von meiner ursprünglichen lösung angestrebt:
Code: Alles auswählen
visa = int(round(20*(a/(a+c+g+t))))
visc = int(round(20*(c/(a+c+g+t))))
visg = int(round(20*(g/(a+c+g+t))))
vist = int(round(20*(t/(a+c+g+t))))
print "A:", visa*"*"
print "C:", visc*"*"
print "G:", visg*"*"
print "T:", vist*"*"
die 20 ist nur darstellungsmässig bedingt, damit man nicht zu grobe schritte drin hat wenn man die lösung rundet.
was haltet ihr davon?
EDIT:
jo, das mit dem dictionaries muss ich nochmal anschauen. hab ich eigentlich kein plan wie das genau funktioniert... :/
Re: % zahlen aus liste
Verfasst: Montag 29. November 2010, 16:10
von EyDu
Wenn du Code kopierst oder anfängst zu nummerieren, dann ist das ein deutlicher Hinweis darauf, dass du etwas falsch machst. Die Lösung sind im Normalfall Funktionen, Schleifen, Listen und Dictionaries. Schau dir dein letztes Stück Code mal an und überlege, wo die Unterschieden in den Zeilen liegen.
Re: % zahlen aus liste
Verfasst: Dienstag 30. November 2010, 00:10
von menace
jo danke für den hinweis. klingt logisch wenn mans mal gehört hat

ich werd noch dran rumbasteln sobald ich wieder zeit hab. soweit schonmal danke!!
greez menace