Being an example of my updates to the Python part of the GeSHi syntax highlighter. You can download the source as well.
Code mostly copied from the Python Cookbook.
class foo(bar): def __init__(self, dict): self.__dict__.update(dict) if __name__ == '__main__': d = {1:2, 3:4, 5:6} o = foo(d) print o """ Two-pass pairing heap with multipass auxiliary list This recipe adds a multipass auxiliary list to Tim Peter's code for a two-pass pairing heap presented at [...] """ from collections import deque def _link(x, y): if x[0] <= y[0]: x.append(y) return x else: y.append(x) return y def _merge(x): n = len(x) if n == 1: return [] pairs = [_link(x[i], x[i+1]) for i in xrange(1, n-1, 2)] if n & 1 == 0: pairs.append(x[-1]) pairs.reverse() x = pairs.pop() for i in pairs: x = _link(i, x) return x class AuxList(deque): def multipass(self): while len(self) > 1: self.appendleft(_link(self.pop(), self.pop())) return self.pop()
class Heap: def __init__(self, iterable=[]): self.x = [] self.aux = AuxList([[value] for value in iterable]) def __nonzero__(self): return bool(self.x) def push(self, value): self.aux.append([value]) def pop(self): if self.aux: self.x += self.aux.multipass() result = self.x[0] # raises IndexError if empty self.x = _merge(self.x) return result def __getitem__(self, i): 'Hack to make sorting as easy as: list(Heap(input))' return self.pop() ## Example call >>> print list(Heap('abracadabra')) ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'r', 'r'] class MyClass: … def __getitem__(self, index): … def __setitem__(self, index, value): … def __delitem__(self, index): … if sys.version_info < (2, 0): # They won't be defined if version is at least 2.0 final def __getslice__(self, i, j): return self[max(0, i):max(0, j):] def __setslice__(self, i, j, seq): self[max(0, i):max(0, j):] = seq def __delslice__(self, i, j): del self[max(0, i):max(0, j):]
class foo(bar): def __init__(self, dict): self.__dict__.update(dict) if __name__ == '__main__': d = {1:2, 3:4, 5:6} o = foo(d) print o """ Two-pass pairing heap with multipass auxiliary list This recipe adds a multipass auxiliary list to Tim Peter's code for a two-pass pairing heap presented at [...] """ from collections import deque def _link(x, y): if x[0] <= y[0]: x.append(y) return x else: y.append(x) return y def _merge(x): n = len(x) if n == 1: return [] pairs = [_link(x[i], x[i+1]) for i in xrange(1, n-1, 2)] if n & 1 == 0: pairs.append(x[-1]) pairs.reverse() x = pairs.pop() for i in pairs: x = _link(i, x) return x class AuxList(deque): def multipass(self): while len(self) > 1: self.appendleft(_link(self.pop(), self.pop())) return self.pop()
class Heap: def __init__(self, iterable=[]): self.x = [] self.aux = AuxList([[value] for value in iterable]) def __nonzero__(self): return bool(self.x) def push(self, value): self.aux.append([value]) def pop(self): if self.aux: self.x += self.aux.multipass() result = self.x[0] # raises IndexError if empty self.x = _merge(self.x) return result def __getitem__(self, i): 'Hack to make sorting as easy as: list(Heap(input))' return self.pop() ## Example call >>> print list(Heap('abracadabra')) ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'r', 'r'] class MyClass: … def __getitem__(self, index): … def __setitem__(self, index, value): … def __delitem__(self, index): … if sys.version_info < (2, 0): # They won't be defined if version is at least 2.0 final def __getslice__(self, i, j): return self[max(0, i):max(0, j):] def __setslice__(self, i, j, seq): self[max(0, i):max(0, j):] = seq def __delslice__(self, i, j): del self[max(0, i):max(0, j):]