[jToolkit-cvs] jToolkit cidict.py,1.3,1.4
Brought to you by:
davidfraser,
friedelwolff
|
From: <dav...@us...> - 2003-12-02 08:21:48
|
Update of /cvsroot/jtoolkit/jToolkit
In directory sc8-pr-cvs1:/tmp/cvs-serv13467
Modified Files:
cidict.py
Log Message:
added more intelligense to handle str/unicode comparisons
added an ordereddict class
Index: cidict.py
===================================================================
RCS file: /cvsroot/jtoolkit/jToolkit/cidict.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** cidict.py 25 Sep 2003 17:36:55 -0000 1.3
--- cidict.py 2 Dec 2003 08:21:43 -0000 1.4
***************
*** 21,24 ****
--- 21,26 ----
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ from __future__ import generators
+
def filterdict(origdict, keyset):
"""returns the subset of origdict containing only the keys in keyset and their corresponding values """
***************
*** 41,44 ****
--- 43,54 ----
if (type(lvalue) != type(rvalue)) and not (type(lvalue) in (str, unicode) and type(rvalue) in (str, unicode)):
diffdict[key] = lvalue
+ elif type(lvalue) != type(rvalue):
+ # handle str/unicode mismatch
+ if type(lvalue) == str: lvaluecmp = lvalue.decode('iso8859')
+ else: lvaluecmp = lvalue
+ if type(rvalue) == str: rvaluecmp = rvalue.decode('iso8859')
+ else: rvaluecmp = rvalue
+ if lvaluecmp != rvaluecmp:
+ diffdict[key] = lvalue
elif lvalue != rvalue:
diffdict[key] = lvalue
***************
*** 119,121 ****
--- 129,211 ----
else:
return default
+
+ class ordereddict(dict):
+ """a dictionary which remembers its keys in the order in which they were given"""
+ def __init__(self, *args):
+ if len(args) == 0:
+ super(ordereddict, self).__init__()
+ self.order = []
+ elif len(args) > 1:
+ raise TypeError("ordereddict() takes at most 1 argument (%d given)" % len(args))
+ else:
+ initarg = args[0]
+ apply(super(ordereddict, self).__init__, args)
+ if hasattr(initarg, "keys"):
+ self.order = initarg.keys()
+ else:
+ # danger: could have duplicate keys...
+ self.order = []
+ checkduplicates = {}
+ for key, value in initarg:
+ if not key in checkduplicates:
+ self.order.append(key)
+ checkduplicates[key] = None
+
+ def __setitem__(self, key, value):
+ alreadypresent = key in self
+ result = dict.__setitem__(self, key, value)
+ if not alreadypresent: self.order.append(key)
+ return result
+
+ def update(self, updatedict):
+ """D.update(E) -> None. Update D from E: for k in E.keys(): D[k] = E[k]"""
+ for key, value in updatedict.iteritems():
+ self[key] = value
+
+ def __delitem__(self, key):
+ alreadypresent = key in self
+ result = dict.__delitem__(self, key)
+ if not alreadypresent: del self.order[self.order.find(key)]
+ return result
+
+ def copy(self):
+ """D.copy() -> a shallow copy of D"""
+ thecopy = ordereddict(super(ordereddict, self).copy())
+ thecopy.order = self.order[:]
+ return thecopy
+
+ def items(self):
+ """D.items() -> list of D's (key, value) pairs, as 2-tuples"""
+ return [(key, self[key]) for key in self.order]
+
+ def iteritems(self):
+ """D.iteritems() -> an iterator over the (key, value) items of D"""
+ for key in self.order:
+ yield (key, self[key])
+
+ def iterkeys(self):
+ """D.iterkeys() -> an iterator over the keys of D"""
+ for key in self.order:
+ yield key
+
+ __iter__ = iterkeys
+
+ def itervalues(self):
+ """D.itervalues() -> an iterator over the values of D"""
+ for key in self.order:
+ yield self[key]
+
+ def keys(self):
+ """D.keys() -> list of D's keys"""
+ return self.order[:]
+
+ def popitem(self):
+ """D.popitem() -> (k, v), remove and return some (key, value) pair as a 2-tuple; but raise KeyError if D is empty"""
+ if len(self.order) == 0:
+ raise KeyError("popitem(): ordered dictionary is empty")
+ k = self.order.pop()
+ v = self[k]
+ del self[k]
+ return (k,v)
+
|