Разбор через сбалансированные скобки и получение соответствующих элементов
Я должен в основном иметь дело со сбалансированными скобками, такими как проблема, но с небольшим изменением. Мне нужно прочитать файл, который выглядит следующим образом (только 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)