Algorithmus problem

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
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
ich habe folgende eingabe Datei:

Code: Alles auswählen

Eingabe Datei:
#A, B, D
C, A, A
A, C, C
A, C, G
T, A, A
T, A, T
T, A, X
Die Datei besteht aus einer Überschrift (#) und Daten.
1. ) Wenn in einer Zeile zwei gleiche Buchstaben z.B A und A in Spalte B und D besitzt dann wird z.B. die Variable BD inkrementiert.
2.) Eine Zeile wird nicht betrachtet wenn:
a) alle Buchstaben unterschiedlich sind oder
b) ein oder mehrere X vorhanden sind.

Code: Alles auswählen

Zwischen schirtt:
#A, B, D   A/B B/D A/D
C, A, A        +1
A, C, C        +1        
A, C, G        
T, A, A        +1
T, A, T            +1 
T, A, X        
A, A, T    +1

Code: Alles auswählen

Ergebnis:
A/B = 1
B/D = 3
A/D = 1      

Code: Alles auswählen

AB = BD = AD = 0
for line in open("../test/input.txt"):
  if line[0] != "#":
    print line.rstrip().split(',')
Leider weiss ich nicht wie man am Besten dieses Problem lösen könnte.

Vielen Dank im Voraus.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Etwas mehr Infos bitte: Wenn 2 Zeichen identisch sind, ist dann die Variable vorgegeben oder muss man das aus den Zwischenschritten auslesen?
Oder berechnet sich das anhand der Stellen/Zeichen der Duplikate?

Fuer Strings gibt es btw `startswith`
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Meinst du so?

Code: Alles auswählen

>>> spam = """CAA
... ACC    
... ACG       
... TAA
... TAT
... TAX       
... AAT""".splitlines()
>>> def eggs(x):
...     if "X" in x:
...         return None
...     for (i, u), (j, v) in itertools.combinations(enumerate(x), 2):
...         if u == v:
...             return (i, j)
... 
>>> map(eggs, spam)
[(1, 2), (1, 2), (3, 4), (1, 2), (0, 2), None, (0, 1)]
Der Rest ist deine Aufgabe.

Sebastian
Das Leben ist wie ein Tennisball.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Den Zwischen schritt habe ich nur eingefügt um das Problem besser erklären zu können und muss nicht vom skript ausgegeben werden. Es soll nur die Eingabedatei betrachtet werden.
Wenn zwei Zeichen gleich sind dann wird die jeweilige Variable (AB oder BD oder AD) inkrementiert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Unter der Annahme, dass der Header immer die erste Zeile ist:

Code: Alles auswählen

with open("data") as f:
    first, second, third = map(str.strip, f.readline()[1:].split(",", 3))
    first_with_second = "%s/%s" % (first, second)
    second_with_third = "%s/%s" % (second, third)
    first_with_third = "%s/%s" % (first, third)
    counter = {
        first_with_second : 0,
        second_with_third : 0,
        first_with_third : 0,
        }
    for line in f:
        if line.startswith("#"):
            continue
        first, second, third = map(str.strip, line.split(",", 3))
        if "X" in (first, second, third):
            continue
        elif first == second:
            counter[first_with_second] += 1
        elif first == third:
            counter[first_with_third] += 1
        elif second == third:
            counter[second_with_third] += 1
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

mit hat geschrieben:Den Zwischen schritt habe ich nur eingefügt um das Problem besser erklären zu können und muss nicht vom skript ausgegeben werden. Es soll nur die Eingabedatei betrachtet werden.
Wenn zwei Zeichen gleich sind dann wird die jeweilige Variable (AB oder BD oder AD) inkrementiert.
Mein Zwischenergebnis ist doch schon die Lösung. Du musst nur noch zählen wie häufig die einzelnen Tupel vorkommen.
Das Leben ist wie ein Tennisball.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Vielen Dank für die Lösungen.
Antworten