% zahlen aus liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

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
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

Hi,

reicht ein kleiner Hinweis zu einem kleinen Problem? :wink: Dann schau dir mal die Methode count des String-Objektes an.

Gruß
Norbert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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})
Das Leben ist wie ein Tennisball.
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

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? ^^
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Code: Alles auswählen

>>> data = "caccctgtgtgcaactttgacaca"
>>> dict(zip("acgt",map(data.count,"acgt")))
{'a': 6, 'c': 8, 't': 6, 'g': 4}
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Dictionary mit String als Key und Integer als Value.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

hm.. das heisst dann also dass man somit zwar die zählung leichter macht aber dann die weiterrechnung mit den werten eher schwieriger oder?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

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... :/
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

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
Antworten