comparison HashTree.py @ 27:9a75eb1b31b3

more work on projects.
author casties
date Mon, 22 Apr 2013 21:01:00 +0200
parents
children 224023958871
comparison
equal deleted inserted replaced
26:8a99ad8713d6 27:9a75eb1b31b3
1 import logging
2
3 class HashTreeNode:
4 """Node of a HashTree.
5 Has a value and keeps children in a dict indexed by key."""
6 key = None
7 value = None
8 children = None
9
10 def __init__(self, key=None, value=None, children=None):
11 """create node"""
12 self.key = key
13 self.value = value
14 self.children = children
15
16
17 def getNode(self, key):
18 """return node under key"""
19 if self.children is None:
20 return None
21 else:
22 return self.children.get(key, None)
23
24
25 def addNode(self, node):
26 """add child node using key from node"""
27 if self.children is None:
28 self.children = {node.key : node}
29 else:
30 self.children[node.key] = node
31
32
33 def getSubtreeList(self):
34 """returns the subtree as list sorted by key (depth first)"""
35 if self.children is None:
36 if self.value is None:
37 return []
38 else:
39 return [self.value]
40
41 else:
42 if self.value is None:
43 sub = []
44 else:
45 sub = [self.value]
46
47 keys = self.children.keys()
48 keys.sort()
49 for k in keys:
50 #logging.debug("getSubtreeList: k=%s sub=%s"%(k,sub))
51 sub.extend(self.children.get(k).getSubtreeList())
52
53 return sub
54
55
56 def getSubtreeAsText(self):
57 """prints whole tree as text"""
58 if self.children is None:
59 return "(%s:%s)"%(self.key, self.value)
60 else:
61 sub = "(%s:%s):["%(self.key, self.value)
62 keys = self.children.keys()
63 keys.sort()
64 for k in keys:
65 sub += self.children.get(k).getSubtreeAsText()
66 sub += ", "
67
68 return sub + "] "
69
70
71 class HashTree:
72 """Tree using dictionaries"""
73
74 root = None
75 keySeparator = '.'
76 keyFn = None
77
78 def __init__(self, keySeparator='.', keyFn=None):
79 """creates a HashTree"""
80 self.root = HashTreeNode()
81 self.keySeparator = keySeparator
82 self.keyFn = keyFn
83
84
85 def getNode(self, key):
86 """gets node under key from the tree.
87 key can be sequence of key string or a single string using keySeparator.
88 """
89 #logging.debug("getNode(key=%s)"%(key))
90 if isinstance(key, basestring):
91 keys = key.split(self.keySeparator)
92 if self.keyFn is not None:
93 keys = [self.keyFn(k) for k in keys]
94 elif isinstance(key, list):
95 keys = key
96 else:
97 keys = [key]
98
99 node = self.root
100 for k in keys:
101 #logging.debug("getNode node=%s k=%s"%(node, repr(k)))
102 node = node.getNode(k)
103 #logging.debug("getNode got:%s"%(node))
104 if node is None:
105 return None
106
107 return node
108
109
110 def get(self, key):
111 """gets value under key from the tree.
112 key can be sequence of key string or a single string using keySeparator.
113 """
114 node = self.getNode(key)
115 if node is None:
116 return None
117
118 return node.value
119
120
121 def add(self, key, value):
122 """adds value under key to the tree.
123 key can be sequence of key string or a single string using keySeparator.
124 """
125 #logging.debug("add(key=%s, value=%s)"%(repr(key), value))
126 if isinstance(key, basestring):
127 keys = key.split(self.keySeparator)
128 if self.keyFn is not None:
129 keys = [self.keyFn(k) for k in keys]
130 elif isinstance(key, list):
131 keys = key
132 else:
133 keys = [key]
134
135 node = self.root
136 for k in keys:
137 nextnode = node.getNode(k)
138 if nextnode is None:
139 nextnode = HashTreeNode(key=k)
140 node.addNode(nextnode)
141
142 node = nextnode
143
144 node.value = value
145
146
147