summaryrefslogtreecommitdiffstats
path: root/Lib/collections.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2010-09-06 21:26:09 (GMT)
committerRaymond Hettinger <python@rcn.com>2010-09-06 21:26:09 (GMT)
commitf45abc97bfad3bc9737a8a8d95c1f4a60cd6f478 (patch)
tree7b24d9113c1d79480cde1daae9ed58199bc0e007 /Lib/collections.py
parent7b2a7710ef17e38e021f6f045b8cd7ad0e96d5e1 (diff)
downloadcpython-f45abc97bfad3bc9737a8a8d95c1f4a60cd6f478.zip
cpython-f45abc97bfad3bc9737a8a8d95c1f4a60cd6f478.tar.gz
cpython-f45abc97bfad3bc9737a8a8d95c1f4a60cd6f478.tar.bz2
Add method to OrderedDict for repositioning keys to the ends.
Diffstat (limited to 'Lib/collections.py')
-rw-r--r--Lib/collections.py23
1 files changed, 17 insertions, 6 deletions
diff --git a/Lib/collections.py b/Lib/collections.py
index c3c51d1..00886ef 100644
--- a/Lib/collections.py
+++ b/Lib/collections.py
@@ -173,18 +173,29 @@ class OrderedDict(dict, MutableMapping):
def __del__(self):
self.clear() # eliminate cyclical references
- def _renew(self, key, PREV=0, NEXT=1):
- 'Fast version of self[key]=self.pop(key). Private method for internal use.'
+ def move_to_end(self, key, last=True, PREV=0, NEXT=1):
+ '''Move an existing element to the end (or beginning if last==False).
+
+ Raises KeyError if the element does not exist.
+ When last=True, acts like a fast version of self[key]=self.pop(key).
+
+ '''
link = self.__map[key]
link_prev = link[PREV]
link_next = link[NEXT]
link_prev[NEXT] = link_next
link_next[PREV] = link_prev
root = self.__root
- last = root[PREV]
- link[PREV] = last
- link[NEXT] = root
- last[NEXT] = root[PREV] = link
+ if last:
+ last = root[PREV]
+ link[PREV] = last
+ link[NEXT] = root
+ last[NEXT] = root[PREV] = link
+ else:
+ first = root[NEXT]
+ link[PREV] = root
+ link[NEXT] = first
+ root[NEXT] = first[PREV] = link
################################################################################