Как я могу создать дерево, используя пакет Python ete2, используя строки, хранящиеся в списке?

Я пытаюсь создать филогенетическое дерево, используя пакет python ete2 на основе синтетических данных, полученных из моей модели клеточного автомата. Данные состоят из пар, перечисленных как (родитель, потомок), где каждый член пары является уникальным целым числом, представляющим событие мутации. Я переписал каждого из членов пары в виде строк и предшествовал им 'r', так что теперь:

('r1', 'r2') будет представлять родителя с именем 'r1', дающего рождение ребенку с именем 'r2'. Таким образом, выходной файл выглядит так:

[['r1' 'r2']
 ['r1' 'r3']
 ['r1' 'r4']
 ['r1' 'r5']
 ['r1' 'r6']
 ['r1' 'r7']
 ['r1' 'r8']
 ['r1' 'r9']
 ['r2' 'r10']
 ['r1' 'r11']
 ['r1' 'r12']
 ['r8' 'r13']
 ['r1' 'r14']
 ['r4' 'r15']
 ['r1' 'r16']
 ['r1' 'r17']
 ['r1' 'r18']
 ['r1' 'r19']]

Я хочу перебрать список, чтобы создать дерево, используя add_child, но продолжаю получать ошибки. Мой текущий код:

t = Tree() # Creates an empty tree
r1 = t.add_child(name="r1")

for row in range(0, len(pairs_list)):
    a = str(pairs_list[row,1])
    b = str(pairs_list[row,0])
    a = b.add_child(name = a)

и я получаю ошибку:

Traceback (most recent call last):
  File "treetest.py", line 33, in <module>
    a = b.add_child(name = a)
AttributeError: 'str' object has no attribute 'add_child'

Если я заменим 'b' в последней строке моего кода на r1 (или что-то еще), это сработает, но, конечно, это не представляет данные... заранее спасибо, юниверс.

1 ответ

Решение

Что-то вроде этого:

t = Tree() # Creates an empty tree
r1 = t.add_child(name="r1")
lookup = {"r1": r1}

def sort_pairs(pair):
    # Extract integer after "r".
    return int(pair[0][1:])

for pair in sorted(pairs_list, key=sort_pairs):
    parentname = pair[0]
    childname = pair[1]
    if childname not in lookup:
        if parentname in lookup:
            # Add child.
            newchild = lookup[parentname].add_child(name = childname)
            lookup.add(childname, newchild)
        else:
            raise RuntimeError('Must not happen.')
Другие вопросы по тегам