Anfänger Hilfe zu Sequenzen, Dict...

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.
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Montag 14. Mai 2007, 09:15

Hallo!

Ich brauch mal wieder eure Hilfe...

Ich bin dabei mein erstes (nützliches) Programm zu Programmieren und habe folgendes Problem:

Es sei eine Sequenz gegeben z.B. attggccaa

Je zwei bestimmten Buchstaben soll ein gewisser Wert zugeordnet werden z.B. at=9,8 ; tt=11,1 ; tg=5,1 ;gg=4,5 usw.

Jetzt hab ich dies in eine Library gepackt und es haben sich folgende Probleme ergeben:

1) Wenn doppelte Paare auftreten, werden diese nicht mit angezeigt (z.B. 2 mal tt soll auch 2 mal 11,1 angeben, wird aber nur als eines ausgeben)

2) Ich möchte die Werte später für eine Formel weiter verwenden und weiss nicht wie ich das anstellen soll (bis jetzt hab ich nur eine print Ausgabe).

Nun meine Frage:

Ist es sinnvoll für die Fragestellung eine Library zu erstellen oder gibt es einen einfacheren Weg? Wenn ja, wie kann ich stäter mit den Werten weiter arbeiten?

Ein Schalgwort oder Link ist auch hilfreich, denn ich weiss nicht unter welchem Topic ich nachschauen soll...

Danke schonmal :D und nicht Lachen-bin blutige Anfängerin...

ete
Zuletzt geändert von ete am Freitag 18. Mai 2007, 07:46, insgesamt 1-mal geändert.
BlackJack

Montag 14. Mai 2007, 10:38

Zu wenig Informationen. Was heisst "in eine Library" gepackt? Und hat es vorher so funktioniert wie Du wolltest? Wies sieht Dein Code aus?

Mir ist auch nicht ganz klar was Du als Rückgabe der Funktion(?) haben möchtest. Eine Liste mit Werten? Eine Summe? Sollen auch überlappende Buchstabenkombinationen in das Ergebnis eingehen? Also ist 'attg' als einmal 'at' und einmal 'tg' zu sehen oder als 'at', 'tt' und 'tg'? Gibt es zu allem möglichen Zwei-Buchstaben-Kombinationen von 'atgc' einen Wert, oder gibt es auch Ausnahmen?
Zizibee
User
Beiträge: 166
Registriert: Donnerstag 12. April 2007, 08:36

Montag 14. Mai 2007, 11:19

BlackJack hat geschrieben:Also ist 'attg' als einmal 'at' und einmal 'tg' zu sehen oder als 'at', 'tt' und 'tg'?
Laut ihrem Beispiel müsste 'attg' in 'at', 'tt' und 'tg' aufgesplittet werden, glaub ich zumindest...

Was heißt denn dieser Teil?
ete hat geschrieben:1) Wenn doppelte Paare auftreten, werden diese nicht mit angezeigt (z.B. 2 mal tt soll auch 2 mal 11,1 angeben, wird aber nur als eines ausgeben)
2 mal 'tt' wäre ja eigentlich 'tttt', wenn ich das Beispiel hier
ete hat geschrieben:Es sei eine Sequenz gegeben z.B. attggccaa
Je zwei bestimmten Buchstaben soll ein gewisser Wert zugeordnet werden z.B. at=9,8 ; tt=11,1 ; tg=5,1 ;gg=4,5 usw.
richtig verstanden habe, dann müsste doch schon bei 'ttt' das zwei mal ausgegeben werden, oder?
BlackJack

Montag 14. Mai 2007, 11:54

Ups, ich hatte die Wertezuordnung nicht im Zusammenhang mit der Beispielzeichenkette gesehen. :oops:
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Montag 14. Mai 2007, 14:00

Vielleicht meint sie mit "Libraries" Dictionairies?
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Montag 14. Mai 2007, 16:11

Sorry für die schlechte Erläuterung :roll:

Also noch mal von vorne:

Ich habe eine Sequenz z.B.

attagctt

2 Buchstaben müssen einen bestimmten Wert bekommen.Jeweils der 1. mit dem 2. , dann der 2. mit dem 3. , der 3. mit dem 4. usw...Also at; ag;ac;aa usw. Wobei der Wert für die Paare immer gleich bleibt.

In meinem Beispiel brauche ich die Werte für

at
tt
ta
ag
gc
ct
und tt.

Später möchte ich die Summe aller Werte zusammen rechnen.
Ich hatte nun ein Dictionairý erstellt:
at:11.1 ; tt:5.0 usw.

Wenn ich die einzelnen 2er mit einer print Anweisung aus dem dic abfrage, bekomme ich die richtigen Werte ausgeben. Aber leider nur ein mal tt anstatt von 2 mal tt (wenn man mein Bsp. betrachtet). Und auserdem weiss ich nicht, wie ich mit den Werten später rechnen kann...Vielleicht ist auch der Ansatz mit meinen Dic vollkommen falsch...

War das verständlicher? Code hab ich gerade nicht zur Hand, kann ich morgen posten...
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 14. Mai 2007, 16:14

Du willst uns aber bestimmt nicht eine Aufgabe die du lösen sollst, uns lösen lassen, oder?
Bitte mal das lesen: http://www.python-forum.de/topic-1689.html

Also im Grunde must du die Buchstabenreihe in zweier Gruppen aufteilen. Dann benötigst du noch ein dict mit den Buchstaben<->Werte Verhältnissen und los gehts...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Montag 14. Mai 2007, 16:45

@ete: Die Idee mit dem Dictionary für die Werte ist schon nicht schlecht. Dann musst Du in einer Schleife über die Zeichenkette gehen. Hier hätten wir mal einen der seltenen Fälle wo der Zugriff über einen Index Sinn macht. In jedem Schritt musst Du zwei Zeichen aus der Zeichenkette per Slice-Notation ausschneiden und im Dictionary den Wert raussuchen. Den dann entweder an eine Liste anfügen oder gleich aufsummieren, je nachdem ob die Einzelwerte benötigt werden oder nicht.
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Dienstag 15. Mai 2007, 07:45

Danke schonmal für die Tips...Und zur Info, ich bin BTA am Pflanzeninstitut und bin dabei mir selber Python mit Büchern anzueignen. Habe weder Abitur, noch bin ich an der Uni...Ich kenne leider niemanden der Python kann...

Ich werd mal weiter probieren.

Um etwas Übung zu bekommen, suche ich mir Programme, die ich selber brauche um dadurch zu lernen...

ciao ete
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Freitag 18. Mai 2007, 07:51

Also ich hab gestern den ganzen Tag probiert und komm nicht weiter :(

Hier mein Problem:

ich weiss nicht wie ich in jedem Schritt der Schleife auf den Index so zugreiffe, das nach jeder Runde die Indexzahlen um eins erhöht werden.

Im 1. Schritt wäre das ja [0:2] , im 2. [1:3] usw. Ich hab alle Referencen durchforstet und nirgends ein ähnliches Bsp. gefunden.

Dann hab ich überlegt das ganze über split() zu machen, komme aber auch nicht weiter...

Danke schonmal :)
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 18. Mai 2007, 08:15

Code: Alles auswählen

for i in xrange(len(text)-2):
    print text[i:i+2]
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Freitag 18. Mai 2007, 08:29

Aha...Jetzt kann ich weiter machen...Vielen Dank!

:wink:
Zizibee
User
Beiträge: 166
Registriert: Donnerstag 12. April 2007, 08:36

Freitag 18. Mai 2007, 08:45

Ich hab da auch mal was versucht. Der Vorschlag von EyDu ist zwar eigentlich der Selbe, aber da ich mir jetzt die "Mühe" gemacht habe es zu schreiben, kann ich es ja trotzdem posten ;)

Code: Alles auswählen

string ="attagctt"
wert = 0

for i in range(len(string)-1):
	paar = string[i:i+2]
	
	if paar == 'ag':
		wert += 1.2
	elif paar == 'at':
		wert += 1.5
	elif paar == 'ct':
		wert += 2.3
	elif paar == 'gc':
		wert += 1.8
	elif paar == 'ta':
		wert += 2.4
	elif paar == 'tt':
		wert += 0.2

print 'Summe: ', wert
Das ist bestimmt nicht die sauberste oder beste Lösung, aber besser kann ich es nicht und es funktioniert :)

[EDIT:] Ausgabe ist:
Summe: 9.6
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Freitag 18. Mai 2007, 09:57

Zizibee hat geschrieben:Das ist bestimmt nicht die sauberste oder beste Lösung, aber besser kann ich es nicht und es funktioniert :)
eine funktionierende Lösung ist einer eleganten, aber nicht funktionierenden Lösung vorzuziehen. Und schlecht ist die Lösung sicher nicht.
Was man eleganter machen könnte, wäre, die paar/werte-beziehungen in ein dictionary packen, da sie eher Daten als Programmlogik sind,
Also Statt deines if-blocks:

Code: Alles auswählen

werte = {
  'ag' : 1.2,
  'at' : 1.5,
 # ...
}
if paar in werte:
  wert += werte[paar]
aber, wie gesagt, dass sind eher Stilfragen
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Freitag 18. Mai 2007, 14:22

Ich hatte es auch über ein Dictonary gemacht, bis ich dann nicht weiter kam...Am Anfang wollte ich es auch über die If Funktion machen, war dann aber zu Faul alle Werte einzugeben (sind zeimlich viele)...

Ist es egal ob man xrange oder range benutzt?

Jetzt kann ich wieder ruhig schlafen :) Danke!


Achja (len(text)-2) muss übrigens -1 sein, da sonst das letzte Paar fehlt...Nur falls das noch jemand benutzen möchte...


ciao ete
Antworten