Advertisement
Guest User

Untitled

a guest
Apr 26th, 2015
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.41 KB | None | 0 0
  1. from collections import namedtuple
  2.  
  3. Node = namedtuple('Node', ['id', 'pid'])
  4.  
  5.  
  6. ACYCLIC_DATASET = [
  7. Node(id='a', pid=None),
  8. Node(id='b1', pid='a'),
  9. Node(id='c1', pid='b1'),
  10. Node(id='c2', pid='b1'),
  11. Node(id='c3', pid='b1'),
  12. Node(id='b2', pid='a'),
  13. Node(id='c4', pid='b2'),
  14. Node(id='c5', pid='b2'),
  15. Node(id='d1', pid='c5'),
  16. Node(id='d2', pid='c5'),
  17. ]
  18.  
  19.  
  20. CYCLIC_DATASET = [
  21. Node(id='xa2', pid='a'),
  22. Node(id='xa1', pid='a'),
  23. Node(id='a', pid='b'),
  24. Node(id='xb1', pid='b'),
  25. Node(id='b', pid='c'),
  26. Node(id='xc1', pid='c'),
  27. Node(id='c', pid='d'),
  28. Node(id='xd1', pid='d'),
  29. Node(id='xd2', pid='d'),
  30. Node(id='d', pid='e'),
  31. Node(id='xe1', pid='e'),
  32. Node(id='e', pid='a'),
  33. ]
  34.  
  35.  
  36. def find_cycle(items):
  37. parents = set(i.pid for i in items if i.pid)
  38.  
  39. cycle = set()
  40. for parent in parents.copy():
  41. item = filter(lambda i: i.id == parent, items)[0]
  42. print 'item:', item
  43. if item.pid in parents:
  44. cycle.add(parent)
  45. print 'pid:', parent, '->', cycle
  46. else:
  47. parents -= set([item.id])
  48. parents -= cycle
  49. parents -= set(i.id for i in filter(lambda i: i.pid == item.id, items))
  50. cycle = set()
  51. print 'clr:', parents
  52.  
  53. if not parents:
  54. return parents
  55.  
  56. return parents
  57.  
  58.  
  59. if __name__ == '__main__':
  60. print find_cycle(CYCLIC_DATASET)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement