source: orange/orange/Orange/misc/collections.py @ 8042:ffcb93bc9028

Revision 8042:ffcb93bc9028, 4.2 KB checked in by markotoplak, 3 years ago (diff)

Hierarchical clustering: also catch RuntimeError when importing matplotlib (or the documentation could not be built on server).

Line 
1import bisect
2import array
3from itertools import izip
4
5class TypedDict(object):
6    """ An space efficient dictionary like object with typed keys and
7    values and O(log(n)) item lookup.
8   
9    Example ::
10   
11        >>> d = TypedDict({1:'a', 2:'b', 3:'c'}, keytype="i", valuetype="c")
12       
13    """
14    __slots__ = ["keytype", "valuetype", "_key_array", "_value_array"]
15    def __init__(self, mapping=None, keytype="I", valuetype="B", _key_array=None, _value_array=None):
16        """
17        :param mapping: If given initialize the TypedDict object from this
18            dict like object
19        :param keytype: A string type code for keys (see `array` module for
20            details)
21        :param valuetype: A string type code for values (see `array` module
22            for details)
23         
24        """
25        self.keytype = keytype
26        self.valuetype = valuetype
27        if _key_array is not None and _value_array is not None:
28            assert(len(_key_array) == len(_value_array))
29            self._key_array = _key_array
30            self._value_array = _value_array
31        elif mapping:
32            items = []
33            for key in mapping:
34                if isinstance(key, tuple) and len(key) == 2:
35                    items.append(key)
36                else:
37                    items.append((key, mapping[key]))
38            items.sort()
39           
40            self._key_array = array.array(self.keytype, [i[0] for i in items])
41            self._value_array = array.array(self.valuetype, [i[1] for i in items])
42        else:
43            self._key_array = array.array(keytype)
44            self._value_array = array.array(valuetype)
45       
46    def __getitem__(self, key):
47        i = bisect.bisect_left(self._key_array, key)
48        if i == len(self._key_array):
49            raise KeyError(key)
50        elif self._key_array[i] == key:
51            return self._value_array[i]
52        else:
53            raise KeyError(key)
54       
55    def __setitem__(self, key, value):
56        i = bisect.bisect_left(self._key_array, key)
57        if i == len(self._key_array):
58            self._key_array.insert(i, key)
59            self._value_array.insert(i, value)
60        elif self._key_array[i] == key:
61            self._value_array[i] = value
62        else:
63            self._key_array.insert(i, key)
64            self._value_array.insert(i, value)
65       
66    def keys(self):
67        return self._key_array.tolist()
68   
69    def values(self):
70        return self._value_array.tolist()
71   
72    def items(self):
73        return zip(self.iterkeys(), self.itervalues())
74   
75    def iterkeys(self):
76        return iter(self._key_array)
77   
78    def itervalues(self):
79        return iter(self._value_array)
80   
81    def iteritems(self):
82        return izip(self.iterkeys(), self.itervalues())
83   
84    def get(self, key, default=None):
85        i = bisect.bisect_left(self._key_array, key)
86        if i == len(self._key_array):
87            return default
88        elif self._key_array[i] == key:
89            return self._value_array[i]
90        else:
91            return default
92       
93    def has_key(self, key):
94        return self.__contains__(key)
95       
96    def update(self, mapping):
97        raise NotImplementedError
98
99    def __len__(self):
100        return len(self._key_array)
101   
102    def __iter__(self):
103        return self.iterkeys()
104   
105    def __contains__(self, key):
106        i = bisect.bisect_left(self._key_array, key)
107        if i == len(self._key_array) or self._key_array[i] != key:
108            return False
109        else:
110            return True
111   
112    def __delitem__(self, key):
113        raise NotImplementedError
114   
115    def clear(self):
116        raise NotImplementedError
117   
118    def todict(self):
119        """ Return a regular dict object initialized from this TypedDict.
120        """
121        return dict(self.iteritems())
122   
123    def __repr__(self):
124        return "TypedDict({0!r})".format(self.todict())
125   
126    def __reduce_ex__(self, protocol):
127        return TypedDict, (), self.__getstate__()
128   
129    def __getstate__(self):
130        return [getattr(self, slot) for slot in self.__slots__]
131   
132    def __setstate__(self, state):
133        for slot, value in zip(self.__slots__, state):
134            setattr(self, slot, value)
135     
Note: See TracBrowser for help on using the repository browser.