| ''' |
| A class which presents the reverse of a sequence without duplicating it. |
| From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu> |
| |
| It works on mutable or inmutable sequences. |
| |
| >>> chars = list(Rev('Hello World!')) |
| >>> print ''.join(chars) |
| !dlroW olleH |
| |
| The .forw is so you can use anonymous sequences in __init__, and still |
| keep a reference the forward sequence. ) |
| If you give it a non-anonymous mutable sequence, the reverse sequence |
| will track the updated values. ( but not reassignment! - another |
| good reason to use anonymous values in creating the sequence to avoid |
| confusion. Maybe it should be change to copy input sequence to break |
| the connection completely ? ) |
| |
| >>> nnn = range(3) |
| >>> rnn = Rev(nnn) |
| >>> for n in rnn: print n |
| ... |
| 2 |
| 1 |
| 0 |
| >>> for n in range(4, 6): nnn.append(n) # update nnn |
| ... |
| >>> for n in rnn: print n # prints reversed updated values |
| ... |
| 5 |
| 4 |
| 2 |
| 1 |
| 0 |
| >>> nnn = nnn[1:-1] |
| >>> nnn |
| [1, 2, 4] |
| >>> for n in rnn: print n # prints reversed values of old nnn |
| ... |
| 5 |
| 4 |
| 2 |
| 1 |
| 0 |
| |
| # |
| >>> WH = Rev('Hello World!') |
| >>> print WH.forw, WH.back |
| Hello World! !dlroW olleH |
| >>> nnn = Rev(range(1, 10)) |
| >>> print nnn.forw |
| [1, 2, 3, 4, 5, 6, 7, 8, 9] |
| >>> print nnn.back |
| [9, 8, 7, 6, 5, 4, 3, 2, 1] |
| |
| >>> rrr = Rev(nnn) |
| >>> rrr |
| <1, 2, 3, 4, 5, 6, 7, 8, 9> |
| |
| ''' |
| |
| class Rev: |
| def __init__(self, seq): |
| self.forw = seq |
| self.back = self |
| |
| def __len__(self): |
| return len(self.forw) |
| |
| def __getitem__(self, j): |
| return self.forw[-(j + 1)] |
| |
| def __repr__(self): |
| seq = self.forw |
| if isinstance(seq, list): |
| wrap = '[]' |
| sep = ', ' |
| elif isinstance(seq, tuple): |
| wrap = '()' |
| sep = ', ' |
| elif isinstance(seq, str): |
| wrap = '' |
| sep = '' |
| else: |
| wrap = '<>' |
| sep = ', ' |
| outstrs = [str(item) for item in self.back] |
| return wrap[:1] + sep.join(outstrs) + wrap[-1:] |
| |
| def _test(): |
| import doctest, Rev |
| return doctest.testmod(Rev) |
| |
| if __name__ == "__main__": |
| _test() |