Python подсчитывает все экземпляры значения, которое имеет более одного ключа - PullRequest
1 голос
/ 24 февраля 2012

Перейдите к РЕДАКТИРОВКА для лучшего объяснения!

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

Хорошо, так что это моя проблема.В заданной последовательности A, T, G и C (да, это ДНК) я должен найти все аминокислоты и посчитать, сколько их из них.С точки зрения непрофессионала, это сводится к этому.

Я должен искать последовательность для определенных паттернов (также называемых кодонами), это трехбуквенные последовательности А и / или Т и / или G и / или С.С каждой аминокислотой связан по крайней мере один кодон.Моя задача - подсчитать количество вхождений каждой аминокислоты.

Во второй таблице вы увидите аминокислоту слева и соответствующие кодоны справа.

У меня есть словарь, настроенный следующим образом:

    aaDic = {'ttt': 'F', 'tct': 'S', 'tat': 'Y', 'tgt': 'C',
    'ttc': 'F', 'tcc': 'S', 'tac': 'Y', 'tgc': 'C',
    'tta': 'L', 'tca': 'S', 'taa': '*', 'tga': '*',
    'ttg': 'L', 'tcg': 'S', 'tag': '*', 'tgg': 'W',
    'ctt': 'L', 'cct': 'P', 'cat': 'H', 'cgt': 'R',
    'ctc': 'L', 'ccc': 'P', 'cac': 'H', 'cgc': 'R',
    'cta': 'L', 'cca': 'P', 'caa': 'Q', 'cga': 'R',
    'ctg': 'L', 'ccg': 'P', 'cag': 'Q', 'cgg': 'R',
    'att': 'I', 'act': 'T', 'aat': 'N', 'agt': 'S',
    'atc': 'I', 'acc': 'T', 'aac': 'N', 'agc': 'S',
    'ata': 'I', 'aca': 'T', 'aaa': 'K', 'aga': 'R',
    'atg': 'M', 'acg': 'T', 'aag': 'K', 'agg': 'R', 
    'gtt': 'V', 'gct': 'A', 'gat': 'D', 'ggt': 'G',
    'gtc': 'V', 'gcc': 'A', 'gac': 'D', 'ggc': 'G',
    'gta': 'V', 'gca': 'A', 'gaa': 'E', 'gga': 'G',
    'gtg': 'V', 'gcg': 'A', 'gag': 'E', 'ggg': 'G'
   }

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

    for codons in aaDic:
    s.count(codons)

(s - последовательность a, t, c, g в приведенном выше коде).Например:

tta, ttg, ctt, ctc, cta, ctg все связаны с аминокислотой L, поэтому мне нужно суммировать все вхождения tta, ttg, ctt, ctc, cta,ctg, чтобы получить общее количество вхождений аминокислоты 'L'.

Надеюсь, я достаточно ясен, это немного сложно объяснить, особенно после попытки сделать это так долго для себя и потерпеть неудачу в этом(что обычно означает, что вы почти ничего не знаете о том, что вы делаете, по крайней мере, со мной так: D)

РЕДАКТИРОВАТЬ:

Позвольте мне попытатьсясделаю себя несколько более ясным:

  1. Нам дана последовательность, состоящая исключительно из букв A, T, C и G.
  2. Мы должны разобрать эту последовательность тритри.

    предположим, что последовательность "TTCTTACTC", мы получаем "TTC", "TTA", "CTC"

  3. Теперь мы ищем эти ключи в словаре и находимассоциированные аминокислоты: TTC - это F TTA - это L CTC - это L
  4. Нам нужно посчитать и сохранить в списке количество F, L иЕще одно значение (FLIMVSPTAY * HQNKDECWRSG) в словаре.
Желаемым выводом будет словарь, подобный следующему:
{L:total no. of the amino acid 'L' in the sequence, S:total no. of the amino acid 'S' in the sequence, ...}

Ответы [ 4 ]

2 голосов
/ 24 февраля 2012

Если вы используете Python 2.7 или выше, вы можете использовать collections.Counter для подсчета аминокислот.Сначала разбейте вашу последовательность оснований на кодоны, затем подсчитайте аминокислоты, соответствующие каждому кодону:

base_seq = "atcgtgagt"
codons = [base_seq[i:i + 3] for i in range(0, len(base_seq), 3)]
amino_acid_counts = collections.Counter(aaDict[c] for c in codons)

Обратите внимание, что генераторное выражение (aaDict[c] for c in codons) генерирует последовательность аминокислот независимо от того, какими кодонами они были кодированы.

Если вы используете более раннюю версию Python, вы также можете использовать простой словарь для подсчета:

amino_acid_counts = dict.fromkeys(aaDict.values(), 0)
for c in codons:
    amino_acid_counts[aaDict[c]] += 1
1 голос
/ 24 февраля 2012

Использование кодонов, разделенных от @ sven-marnach:

base_seq = "atcgtgagt"

# split sequence, 3 by 3
codons = [base_seq[i:i + 3] for i in range(0, len(base_seq), 3)]

# for each codon we have, obtain his associated amino_acid from aaDic
amino_acids = map(aaDic.get, base_seq)
# here, amino_acids is ['I', 'V', 'S']

i_count = amino_acids.count('I')
# and so on

Затем вы можете собрать полученный результирующий дикт с помощью:

aa_names = set(aaDic.values())
return dict((aa_name, amino_acids.count(aa_name) for aa_name in aa_names))
1 голос
/ 24 февраля 2012

Попробуйте следующее:

y = {}
for x in aaDic.items():
    y[x[1]] = []
for x in aaDic.items():
    y[x[1]].append(x[0])

Затем вы можете найти все значения с помощью клавиш X с помощью:

xkv = [ k for k in y.keys() if len(y[k]) == X ]
1 голос
/ 24 февраля 2012

Если у вас нет 2.7+, вы все равно можете использовать defaultdict:

counts = collections.defaultdict(int)
for k in aaDic:
    counts[aaDic[k]] += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...