Повторяющиеся строки с неоднозначностью - PullRequest
0 голосов
/ 14 мая 2019

У меня есть большой (5-10 миллионов) набор строк с ограниченным алфавитом нуклеотидных символов (A, T, C и G) вместе с подстановочным символом N. С каждой строкой связано целое число.

Я хочу найти все уникальные строки и для каждой суммировать их целочисленные значения.«Представительная» строка для набора одинаковых строк должна быть строкой с наибольшим целочисленным значением.Например, с учетом:

NTG 9
NAG 6
ANG 5
TTT 2
ATG 2

Я хочу, чтобы выходные данные были:

NTG 14
NAG 6
ATG 2
TTT 2

С набором данных такого размера парные сравнения не осуществимы.Есть идеи?

1 Ответ

0 голосов
/ 16 мая 2019

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

Код:

import re

test = """
NTG 9
NAG 6
ANG 5
TTT 2
ATG 2
"""

test = [x.split(" ") for x in test.upper().split("\n") if x != ""]
#print(test)

index = 0
while index < len(test):
    seq = test[index]
    seq_regex = seq[0].replace("N", ".")
    no_match_li = [x for x in test if len(re.findall(seq_regex, x[0])) == 0]
    match_li = [int(x[1]) for x in test if len(re.findall(seq_regex, x[0])) != 0]
    #print(no_match_li, match_li)
    test = [[seq[0], sum(match_li)]] + no_match_li
    index += 1

test = sorted(test, key=lambda x: x[1], reverse=True)
for seq in test:
    print(seq[0], seq[1])

Выход:

NTG 11
NAG 6
ANG 5
TTT 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...