построение дерева из CSV-файла с использованием Python - PullRequest
1 голос
/ 21 марта 2011

Мой CSV-файл имеет следующий формат

Col1        Col2
a           b
b           c
c           d
d           e
x           b
y           c
z           c
m           x
h           b
i           b

Я создам словарь для хранения этих данных следующим образом

{ b:[a,x,h,i] , c:[b,y,z], d:[c], e:[d], x:[m] } 

Из этого словаря я хочу иметь возможность построитьиерархия.Например: когда я иду по словарю для «а», я должен иметь возможность отображать

 a -> b -> c -> d -> e

Аналогично для «у»

 y -> c -> d -> e

Я могу думать об этом как о деревеструктурируйте и представьте, что это первый шаг в глубину, но я не уверен, как достичь этого с помощью словаря в python.Это не будет дерево решений или двоичное дерево и т. Д.

Ответы [ 3 ]

3 голосов
/ 21 марта 2011

Вы можете использовать Python-Graph .

pairs = read_from_csv(...)

from pygraph.classes.digraph import digraph 
gr = digraph()
gr.add_nodes(set([x for (x,y) in pairs]+[y for (x,y) in pairs]))

for pair in pairs:
    gr.add_edge(pair)

#and now you can do something with the graph...

from pygraph.algorithms.searching import depth_first_search

print ' -> '.join(depth_first_search(gr, root='a')[1])
print ' -> '.join(depth_first_search(gr, root='y')[1])
0 голосов
/ 21 марта 2011

Вот решение, которое просто использует словари:

from itertools import chain

def walk(d, k):
    print k,
    while k in d:
        k = d[k]
        print '->', k,

data = {'b': ['a','x','h','i'], 'c': ['b','y','z'], 'd': ['c'], 'e': ['d'], 'x': ['m']}
hierarchy = dict(chain(*([(c, p) for c in l] for p, l in data.iteritems())))
# {'a':'b', 'c':'d', 'b':'c', 'd':'e', 'i':'b', 'h':'b', 'm':'x', 'y':'c', 'x':'b', 'z':'c'}

walk(hierarchy, 'a') # prints 'a -> b -> c -> d -> e'
walk(hierarchy, 'y') # prints 'y -> c -> d -> e'
0 голосов
/ 21 марта 2011

псевдокод:

filedict = {}
for row in file:
  try:
    filedict[row.col2].append(row.col1)
  except:
    filedict[row.col2] = [row.col1]
invdict = dict((v,k) for k, v in filedict.iteritems())
def parse(start):
  if start not in invdict:
    return []
  next = invdict[start]
  return [next] + parse(next)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...