Проблемы с добавлением значений в упорядоченном словаре из цикла - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь написать программу, которая принимает несколько входных последовательностей (строк) переменной длины и подсчитывает количество идентичных символов с одинаковым индексом в каждой строке, чтобы найти строки с наибольшим количеством совпадений.Если строки имеют разную длину, я бы хотел добавить символы «N» в конец, пока они не станут одинаковой длины.

import random

def DNA(length):
    return ''.join(random.choice('CGTA') for i in range(length))

seq_lst = [DNA(20) for i in range(5)]
print(seq_lst)

from collections import OrderedDict

count_dict = OrderedDict()
count_dict['_0_to_1count'] = 0
count_dict['_0_to_2count'] = 0
count_dict['_0_to_3count'] = 0
count_dict['_0_to_4count'] = 0
count_dict['_1_to_2count'] = 0
count_dict['_1_to_3count'] = 0
count_dict['_1_to_4count'] = 0
count_dict['_2_to_1count'] = 0
count_dict['_2_to_3count'] = 0
count_dict['_2_to_4count'] = 0
count_dict['_3_to_1count'] = 0
count_dict['_3_to_2count'] = 0
count_dict['_3_to_4count'] = 0


indexa = 0
indexb = 1
indexc = 0
indexd = 0

for i in seq_lst[indexa]:
    if i == seq_lst[indexb][indexc]:
        count_dict[indexd][2]
        indexc += 1
    if indexc == len(seq_lst[indexb]):
        indexb += 1
        indexd += 1
    if indexb > len(seq_lst):
        indexa +=1
        indexb = indexa + 1
    if indexa > len(seq_lst):
        break



print(count_dict)

Редактировать Новый угол, над которым я работаю:

seqs = ['GTACGCCTTCTTCGGATTGTTAGCCCCTTTTGTTGGGTTACTGCT', 'CCGTGGTTGTTTGTTGAGCTGGGGCTTGTTGCGTGATGCAGCAT', 'TGGGAATTTTGGAATGGGGGAAACCCTGATCAGCCTCCCGCGTG', 'GGGTGTGTGAAGAAGGCCTTCGGGTTGTAAAGCACTTTCAGCGG', 'GATGAAGGCCTTCGGGTTGTAAAGTACTTTTGGCAGAGAAGAAA']

indexa = 0

for i in seqs: # iterates through each string in list seqs
    if len(i) < ((max(len(i) for i in seqs))): # Identifies any string which is 
                                                 shorter than the longest string
        seqs[indexa].append('N') # Appends all shorter strings with 'N' to make 
                                   the same length. (**DOESN'T WORK** How to 
                                   call the index of the current iteration?)
    indexa += 1 # Count for append

print(seqs)

largest_matches = []

seq_pos = 0 

    for i in seqs: # iterates through each string
        matches = {} # Creates dictionary to keep track of counts for each 
                       comparison
        for j in seqs[i]: # Iterates through each character in the current 
                            string

                for s in seqs[i+1:]: # Compares character at index j in the 
                                       current string i to *only* subsequent 
                                       strings, at the same index value
                    if j == seqs[s][j]: # Compares the current character (j) 
                                          in the current string (i) to the 
                                          corresponding character in subsequent 
                                          strings (s)(**NOT SURE IF THIS 
                                          WORKS**)
                        matches[seqs[i][j], seqs[s][j]] += 1 # Counts "matches" 
                                                               at each index
**NEED CODE HERE FOR SUMMING ALL MATCHES AT EACH INDEX FOR EACH PAIR. FOLLOWING CODE SHOULD WORK IF A DICTIONARY CALLED MATCH_SUMS IS CREATED PRIOR (I'M NOT SURE HOW TO DO THIS.)**                  
        for l, o in match_sums.items(): # iterates through summed match counts 
                                            for each pairing
            if o == max(o) # checks to see if current value, o (matches),  at 
                             key l (string pair) has the largest or tied for the 
                             largest number of matches
            largest_match.append(l, o)
    seq_pos += 1
    if seq_pos == (len(seqs)):
        break # ends loop at sequence 5, or last sequence, as all pairings have 
                then been evaluated. (4 to 5 being the last pairing here)
'''





1 Ответ

1 голос
/ 07 мая 2019

Не понимаю часть того, что вы спрашиваете, но я предоставлю отличный способ сравнить две строки, которые затем можно использовать для сравнения созданного вами словаря с n перестановками.

В информатике и математике существует понятие, называемое Расстояние Левенштейна , которое используется для измерения разницы между двумя последовательностями символов.

Это отличная база длялитературный анализ и вычислительный способ сравнения строк, и вы можете использовать его, чтобы определить, сколько изменений потребуется, чтобы получить от одной строки к другой посредством вставок, удалений и подстановок.

Математически это расстояниестрок a и b измеряется следующим образом: levenshtein distance

Какой-то код псевдо для Расстояние Левенштейна :

function LevenshteinDistance(char s[1..m], char t[1..n]):
  // for all i and j, d[i,j] will hold the Levenshtein distance between
  // the first i characters of s and the first j characters of t
  // note that d has (m+1)*(n+1) values
  declare int d[0..m, 0..n]

  set each element in d to zero

  // source prefixes can be transformed into empty string by
  // dropping all characters
  for i from 1 to m:
      d[i, 0] := i

  // target prefixes can be reached from empty source prefix
  // by inserting every character
  for j from 1 to n:
      d[0, j] := j

  for j from 1 to n:
      for i from 1 to m:
          if s[i-1] = t[j-1]:
            substitutionCost := 0
          else:
            substitutionCost := 1
          d[i, j] := minimum(d[i-1, j] + 1,                   // deletion
                             d[i, j-1] + 1,                   // insertion
                             d[i-1, j-1] + substitutionCost)  // substitution

  return d[m, n]

Другим аналогичным методом является расстояние Дамерау – Левенштейна .

По моему опыту, это то, чтоЯ рекомендуюd, чтобы найти, какие из них являются наиболее близкими, поскольку вы можете получить расстояние (любой формулы) между двумя последовательностями ДНК, а затем выбрать ту, которая имеет наименьшее расстояние из всех сравнений.Поскольку это звучит как домашнее задание, я не хочу предлагать решение, так как вам нужно учиться, но есть много ресурсов в Интернете, и это должно дать хорошее начало тому, что вы пытаетесь сделать.

...