Найти всех родителей для ребенка с lookthru path и другими столбцами в python - PullRequest
0 голосов
/ 29 мая 2019

Я действительно новичок в питоне. Не могли бы вы помочь в решении следующей проблемы

У меня есть следующая таблица:

Parent  Child   value 1 Value 2

a0      b1      0.2         5

b5      c1      0.3         2

a0      b2      0.5         6

a1      b3      0.6         3

a1      b4      0.7         58

a2      b5      0.5         63

f0      a0      0.6         9

f0      a1      0.8         5

f0      a2      0.5         5

a0      b0      0.2         6

b5      c0      0.6         4

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

Ожидаемый результат

Root    Parent  Child   Path              Value 3 

f0      b5      c1      f0/a2/b5/c1       0.5 * 0.5 * 0.3  (f0->a2 * a2->b5 * b5->c1)

f0      a0      b0      f0/a0/b0          0.6 * 0.2  (f0->a0 * a0->b0)

f0      a1      b4      f0/a1/b4          ..and so on

f0      a1      b3      f0/a1/b3    

f0      b5      c0      f0/a2/b5/c0 

f0      a0      b2      f0/a0/b2    

f0      a0      b1      f0/a0/b1

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

parents = set() children = {} for c,p in ancestry:
    parents.add(p)
    children[c] = p

def ancestors(p):
    return (ancestors(children[p]) if p in children else []) + [p] 

для k in (set (children.keys ()) - родители): print ('/'.join(ancestors(k)))

любая помощь очень ценится.

1 Ответ

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

Я не уверен, как решить эту проблему с помощью рекурсии, но приведенное ниже решение может работать для вас.Поскольку вы уже вытянули конечные узлы и перешли к родительскому узлу, я добавил кортеж «childvalues» для отслеживания родителя и его значения для каждого дочернего узла.Затем я прошел вверх, чтобы получить каждого родителя одного за другим с результатом умножения

def ancestor(child):
    child_weight = 1
    childpath = "/" + child
    while (child in childvalues):
        pathValue = childvalues[child][1]
        child_weight = child_weight * pathValue
        child = childvalues[child][0]
        childpath = childpath + "/" + child
    return (childpath, child_weight)
ancestry = [
    ('b1', 'a0', 0.1),
    ('c1', 'b5', 0.2),
    ('b2', 'a0', 0.3),
    ('b3', 'a1', 0.4),
    ('b4', 'a1', 0.5),
    ('b5', 'a2', 0.6),
    ('a0', 'f0', 0.7),
    ('a1', 'f0', 0.8),
    ('a2', 'f0', 0.9),
    ('b0', 'a0', 0.11),
    ('c0', 'b5', 0.12),
]
parents = set()
childvalues = {}
for child, parent, value in ancestry:
    parents.add(parent)
    childvalues[child] = (parent, value)
for leaf_node in (set(childvalues.keys()) - parents):
    print(ancestor(leaf_node))
...