Разбор через сбалансированные скобки и получение соответствующих элементов

Я должен в основном иметь дело со сбалансированными скобками, такими как проблема, но с небольшим изменением. Мне нужно прочитать файл, который выглядит следующим образом (только 2 строки в файле):

aguuguuagucuacguggaccgacaagaacaguuucgaaucggaagcuugcuuaacguaguucuaacaguuuuuuauuag agagcagaucucugaugaacaaccaacgaaaaaagacgggucgaccgucuuucaauaugcugaaac
...((((((.((((((...((((...(((....)))...)))(((....))).))))))..)))))).........((((((.....))))))..................(((((((.....))))))).................

Как видите, каждая буква имеет соответствующий "(" или ")" или "." с ним связаны все круглые скобки, но они вложенные. Как и в формуле, каждый "(" и ")" означает, что есть пара с соответствующими алфавитами вверху.

Например, если: "(" имеет алфавит "a" над ним и соответствующий ")" {, который делает его сбалансированным}, имеет "u" над ним, означает, что существует пара "a" - "u". "." означает, что эти алфавиты не имеют спаривания. таким образом мне нужно создать полное отображение всех пар и записать его в новый файл.

Во всех случаях "a" соединяется с "u", а "g" - с "c".

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

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

РЕДАКТИРОВАТЬ: мне нужно вывод для каждого набора сбалансированных скобок, чтобы выглядеть следующим образом:

Input: gaacaguuuc
       (((....)))

Output: cagu have no pairs //because they have dots underneath
        g-c 
        a-u
        a-u

1 ответ

Решение

Я уверен, что не умник. Но это мое решение вашей проблемы, насколько я понял.

inp1 = "agucagcguagcugaucguga"
inp2 = "(..(((...(()).)...)))"

bkts = []
nomatch = []
pairs = []

for idx in range(len(inp2)):
    c = inp2[idx];
    if c == '(':
        bkts.append(inp1[idx])
    elif c == '.':
        nomatch.append(inp1[idx])
    elif c == ')':
        if len(bkts) > 0:
            pair = [bkts.pop(), inp1[idx]]
            pairs.append('-'.join(pair))
        else :
            print "error: Too many closing bkts"

if len(bkts) > 0 :
    print "Unmatched brackets! Too many open"

print "unmatched: " + ','.join(nomatch)
print "matches: " + ','.join(pairs)
Другие вопросы по тегам