Similarity, nested loops [Python]

RoadrunnersGhost

Grünschnabel
Hey zusammen,

hänge gerade an einer Aufgabe ein Programm zu schreiben, dass verschiedene Sequenzen miteinander vergleicht. Ich arbeite mit Python 3.x
Zuerst habe ich eine similarity Funktion definiert:

Python:
def similarity(a,b):
    purine=["A", "G"]
    pyrimidine=["T", "C"]
    if len(a) != len(b):
        print("Error: both sequences must have the same length.")
        return None
    result = 0
    for i in range(len(a)):
        if a[i]==b[i]:
            result=result+1
        elif a[i] in purine and b[i] in purine:
            result=result+0.5
        elif a[i] in pyrimidine and b[i] in pyrimidine:
            result=result+0.5
        else:
            result=result+0
    return result

und anschließend das Programm um die verschiedenen Sequenzen zu vergleichen:

Python:
sequences=["ATCCGGT", "GCGTTAC", "CTACTGC", "TTGCAGT", "AGTCACC"]

# Initialize variables
highest_similarity=0
index1=0
index2=0

# Find the two most similar sequences.
# Make sure that you don't compare a sequence
# against itself!

for i in range(len(sequences)):
    for j in range(i+1,5):
        s=similarity(i,j)
        if s > highest_similarity:
            highest_similarity=s
            index1=i
            index2=j

print("The two sequences with the highest similarity are")
print(sequences[index1], "and", sequences[index2])
print("Their similarity is", highest_similarity)

Wenn ich das Programm jetzt mit Python starte kommt folgende Fehlermeldung:

Traceback (most recent call last):
File "C:/Users/.../sequence_similarity.py", line 14, in <module>
s=similarity(i,j)
NameError: name 'similarity' is not defined

Was bedeutet das? Ich habe similarity ja mit dem oberen Programm schon definiert. Stehe gerade etwas auf dem Schlauch.

Grüße, Road


EDIT:

Wenn ich beide Teile in ein Programm zusammenfasse, bekomme ich eine andere Fehlermeldung:

Python:
def similarity(a,b):
    purine=["A", "G"]
    pyrimidine=["T", "C"]
    if len(a) != len(b):
        print("Error: both sequences must have the same length.")
        return None
    result = 0
    for i in range(len(a)):
        if a[i]==b[i]:
            result=result+1
        elif a[i] in purine and b[i] in purine:
            result=result+0.5
        elif a[i] in pyrimidine and b[i] in pyrimidine:
            result=result+0.5
        else:
            result=result+0
    return result

# Programmanfang

sequences=["ATCCGGT", "GCGTTAC", "CTACTGC", "TTGCAGT", "AGTCACC"]

# Initialize variables
highest_similarity=0
index1=0
index2=0

# Find the two most similar sequences.
# Make sure that you don't compare a sequence
# against itself!

for i in range(len(sequences)):
    for j in range(i+1,5):
        similarity(i,j)
        if similarity > highest_similarity:
            highest_similarity=s
            index1=i
            index2=j

print("The two sequences with the highest similarity are")
print(sequences[index1], "and", sequences[index2])
print("Their similarity is", highest_similarity)

Fehlermeldung:

Traceback (most recent call last):
File "C:/Users/~/sequence_similarity.py", line 34, in <module>
similarity(i,j)
File "C:/Users/~/sequence_similarity.py", line 4, in similarity
if len(a) != len(b):
TypeError: object of type 'int' has no len()

EDIT2:

Kann es sein, dass es an der Zeile 33
Python:
for j in range(i+1,5):
liegt? Also dass er dann in similarity(a,b) die Zahlen in der Liste, statt dem str in der Liste nimmt? Also zb similarity(1,2) statt similarity("GCGTTAC", "CTACTGC")? Und falls ja, wie kann ich das Programm dazu zu bringen letzteres zu verwenden?

EDIT3: Hab den Fehler gefunden. Habe in Zeile 33 etwas vergessen...
Python:
s=similarity(sequences[i],sequences[j])
 
Zuletzt bearbeitet:
Zurück