Estoy intentando crear una matriz de triángulo inferior, sin importaciones (aunque utilizo una importar al principio). La función que he escrito toma una lista de secuencias de ADN, las compara e ingresa un flotante en una lista de listas. Sin embargo, el problema es que creé accidentalmente el triángulo superior. Aquí está mi código (incluiré las otras funciones para que tenga sentido):

def sequence_difference(seq1, seq2):
    counter = 0

    if len(seq1) == len(seq2):
        for i in range(len(seq1)):
            if seq1[i] != seq2[i]:
                 counter += 1
        return counter / len(seq1)

    else:
         return ''

def jukes_cantor(diff):
    K = -(3/4) * log(1 - (4/3) * diff)
    return K

def lower_trian_matrix(list_of_seq):
    matrix = []

    for i in range(len(list_of_seq)):
         matrix.append([])

         for j in range(i + 1, len(list_of_seq)):
            matrix[i].append(jukes_cantor(sequence_difference(list_of_seq[j], list_of_seq[i])))     
    return matrix

sequences = ['TAAAAAAAAAAA',
             'TTAAAAAAAAAA', 
             'AAAAAAAAAAGG', 
             'AAAAAAAAGGGG']

print(lower_trian_matrix(sequences))

Emite:

[[0.08833727674228764, 0.30409883108112323, 0.6081976621622466], 
 [0.4408399986765892, 0.8239592165010822], 
 [0.18848582121067953], 
 []]

Pero quiero que salga:

[[], 
 [0.08833727674228764], 
 [0.30409883108112323, 0.4408399986765892], 
 [0.6081976621622466, 0.8239592165010822, 0.18848582121067953]]

El sequence_difference devuelve cuán diferentes son dos secuencias en frecuencias. jukes_cantor devuelve una estimación corregida de cuánto han cambiado realmente las secuencias a lo largo de la evolución.

2
Rune Toft 9 dic. 2020 a las 12:49

2 respuestas

La mejor respuesta

Simplemente invierta la indexación para i y j:

from math import log

def sequence_difference(seq1, seq2):
    counter = 0

    if len(seq1) == len(seq2):
        for i in range(len(seq1)):
            if seq1[i] != seq2[i]:
                counter += 1
        return counter / len(seq1)

    else:
        return ''

def jukes_cantor(diff):
    K = -(3/4) * log(1 - (4/3) * diff)
    return K

def lower_trian_matrix(list_of_seq):
    matrix = [[]]

    for i in range(1, len(list_of_seq)):
        matrix.append([])

        for j in range(i):
            matrix[i].append(jukes_cantor(sequence_difference(list_of_seq[j], list_of_seq[i])))     
    return matrix

sequences = ['TAAAAAAAAAAA',
             'TTAAAAAAAAAA', 
             'AAAAAAAAAAGG', 
             'AAAAAAAAGGGG']

print(lower_trian_matrix(sequences))

Alternativamente, cámbiele el nombre a def upper_trian_matrix(list_of_seq): y dígale a su maestro que siempre quiso crear el triángulo superior.

0
Mr. T 9 dic. 2020 a las 10:33

Imprima esta línea matrix.append ([]) debajo de esto para el ciclo for j in range(i + 1, len(list_of_seq)): matrix[i].append(jukes_cantor(sequence_difference(list_of_seq[j], list_of_seq[i])))

Actualmente, está por encima, por lo que se ejecuta primero.

0
Muskan Arora 9 dic. 2020 a las 10:08
65214378