comparison lookup_list.py @ 12:ff4e551490f1

Added LookupList type in lookup_list.py and used it to keep order of field names in Example in ArrayDataSet. Example is now just = LookupList.
author bengioy@esprit.iro.umontreal.ca
date Wed, 26 Mar 2008 18:21:57 -0400
parents
children 759d17112b23
comparison
equal deleted inserted replaced
11:be128b9127c8 12:ff4e551490f1
1
2 class LookupList(object):
3 """
4 A LookupList is a sequence whose elements can be named (and unlike
5 a dictionary the order of the elements depends not on their key but
6 on the order given by the user through construction) so that
7 following syntactic constructions work as one would expect:
8 example = Example(['x','y','z'],[1,2,3])
9 example.x = [1, 2, 3] # set or change a field
10 x, y, z = example
11 x = example[0]
12 x = example["x"]
13 print example.keys() # returns ['x','y','z']
14 print example.values() # returns [[1,2,3],2,3]
15 """
16 def __init__(self,names=[],values=[]):
17 assert len(values)==len(names)
18 self.__dict__['_values']=values
19 self.__dict__['_name2index']={}
20 self.__dict__['_names']=names
21 for i in xrange(len(values)):
22 self._name2index[names[i]]=i
23
24 def keys(self):
25 return _names
26
27 def values(self):
28 return _values
29
30 def items(self):
31 return zip(self._names,self._values)
32
33 def __getitem__(self,key):
34 """
35 The key in example[key] can either be an integer to index the fields
36 or the name of the field.
37 """
38 if isinstance(key,int):
39 return self._values[key]
40 else: # if not an int, key must be a name
41 return self._values[self._name2index[key]]
42
43 def __setitem__(self,key,value):
44 if isinstance(key,int):
45 self._values[key]=value
46 else: # if not an int, key must be a name
47 if key in self._name2index:
48 self._values[self._name2index[key]]=value
49 else:
50 self._name2index[key]=len(self)
51 self._values.append(value)
52 self._names.append(key)
53
54 def __getattr__(self,name):
55 return self._values[self._name2index[name]]
56
57 def __setattr__(self,name,value):
58 if name in self._name2index:
59 self._values[self._name2index[name]]=value
60 else:
61 self._name2index[name]=len(self)
62 self._values.append(value)
63 self._names.append(name)
64
65 def __len__(self):
66 return len(self._values)
67
68 def __repr__(self):
69 return "{%s}" % ", ".join([str(k) + "=" + repr(v) for k,v in self.items()])