Python: изменение значения несовпадающего ключа в словаре - PullRequest
0 голосов
/ 09 февраля 2020

Этот код должен найти наиболее частые k-мерс (подстроки из k букв) с d несоответствиями в строке (геном). В прошлом мне приходилось искать наиболее частые k-mer без несоответствий, и я стараюсь минимально изменить свой код. Для этого я должен иметь возможность увеличивать значения в словаре, ключ которого отличается от строки, которую я передаю. Это возможно? Ниже мой код. Есть ли способ сделать то, что я написал в комментарии? HammingDistance() просто вычисляет количество различий между двумя строками.

import operator

def MostFrequentKmer (Text, k, d):
    kmerDict = {}
    freqKmers = list()

    for i in range (0, len(Text)-k+1):
        kmer = Text[i:i+k]
        if kmer in kmerDict:
            kmerDict[kmer] += 1

        #elif a key exists for which HammingDistance(key, kmer) <= d, then increment the value associated with that key

        else:
            kmerDict[kmer] = 1

    maxVal = max(zip(kmerDict.values()))[0]

    for k, v in kmerDict.items():
        if v == maxVal:
            freqKmers.append(k)

    print(sorted(freqKmers))


def HammingDistance (str1, str2):
    hamDis = 0
    for i in range(0, len(str1)):
        if str1[i] != str2[i]:
            hamDis += 1
    return hamDis

Пример ввода-вывода:
Input- ("ACGTTGCATGTCGCATGATGCATGAGAGCT", 4, 1)
Output- ["ATG C "," ATGT "," GATG "]

1 Ответ

2 голосов
/ 09 февраля 2020

Предполагая, что вы хотите 1) увеличить счетчик для всех ближайших ключей и 2) добавить запись, если нет ближайших ключей, ниже делает то, что вы хотите.

else:
  close_keys = [k for k in kmerDict.keys() if HammingDistance(k, kmer) <= d]
  if close_keys:
    for k in close_keys:
      kmerDict[k] += 1
  else:
    kmerDict[k] = 1

В качестве отступления, пожалуйста рассмотрите следующие python соглашения об именах, например, измените HammingDistance на hamming_distance.

...