Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 1 | # A class which presents the reverse of a sequence without duplicating it. |
| 2 | # From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu> |
| 3 | |
| 4 | # It works on mutable or inmutable sequences. |
| 5 | # |
| 6 | # >>> for c in Rev( 'Hello World!' ) : sys.stdout.write( c ) |
| 7 | # ... else: sys.stdout.write( '\n' ) |
| 8 | # ... |
| 9 | # !dlroW olleH |
| 10 | # |
| 11 | # The .forw is so you can use anonymous sequences in init, and still |
| 12 | # keep a reference the forward sequence. ) |
| 13 | # If you give it a non-anonymous mutable sequence, the reverse sequence |
| 14 | # will track the updated values. ( but not reassignment! - another |
| 15 | # good reason to use anonymous values in creating the sequence to avoid |
| 16 | # confusion. Maybe it should be change to copy input sequence to break |
| 17 | # the connection completely ? ) |
| 18 | # |
| 19 | # >>> nnn = range( 0, 3 ) |
| 20 | # >>> rnn = Rev( nnn ) |
| 21 | # >>> for n in rnn: print n |
| 22 | # ... |
| 23 | # 2 |
| 24 | # 1 |
| 25 | # 0 |
| 26 | # >>> for n in range( 4, 6 ): nnn.append( n ) # update nnn |
| 27 | # ... |
| 28 | # >>> for n in rnn: print n # prints reversed updated values |
| 29 | # ... |
| 30 | # 5 |
| 31 | # 4 |
| 32 | # 2 |
| 33 | # 1 |
| 34 | # 0 |
| 35 | # >>> nnn = nnn[1:-1] |
| 36 | # >>> nnn |
| 37 | # [1, 2, 4] |
| 38 | # >>> for n in rnn: print n # prints reversed values of old nnn |
| 39 | # ... |
| 40 | # 5 |
| 41 | # 4 |
| 42 | # 2 |
| 43 | # 1 |
| 44 | # 0 |
| 45 | # >>> |
| 46 | # |
| 47 | # WH = Rev( 'Hello World!' ) |
| 48 | # print WH.forw, WH.back |
| 49 | # nnn = Rev( range( 1, 10 ) ) |
| 50 | # print nnn.forw |
| 51 | # print nnn |
| 52 | # |
| 53 | # produces output: |
| 54 | # |
| 55 | # Hello World! !dlroW olleH |
| 56 | # [1, 2, 3, 4, 5, 6, 7, 8, 9] |
| 57 | # [9, 8, 7, 6, 5, 4, 3, 2, 1] |
| 58 | # |
| 59 | # >>>rrr = Rev( nnn ) |
| 60 | # >>>rrr |
| 61 | # <1, 2, 3, 4, 5, 6, 7, 8, 9> |
| 62 | |
| 63 | from string import joinfields |
| 64 | class Rev: |
| 65 | def __init__( self, seq ): |
| 66 | self.forw = seq |
| 67 | self.back = self |
| 68 | def __len__( self ): |
| 69 | return len( self.forw ) |
| 70 | def __getitem__( self, j ): |
| 71 | return self.forw[ -( j + 1 ) ] |
| 72 | def __repr__( self ): |
| 73 | seq = self.forw |
| 74 | if type(seq) == type( [] ) : |
| 75 | wrap = '[]' |
| 76 | sep = ', ' |
| 77 | elif type(seq) == type( () ) : |
| 78 | wrap = '()' |
| 79 | sep = ', ' |
| 80 | elif type(seq) == type( '' ) : |
| 81 | wrap = '' |
| 82 | sep = '' |
| 83 | else: |
| 84 | wrap = '<>' |
| 85 | sep = ', ' |
| 86 | outstrs = [] |
| 87 | for item in self.back : |
| 88 | outstrs.append( str( item ) ) |
| 89 | return wrap[:1] + joinfields( outstrs, sep ) + wrap[-1:] |