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' ) |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 8 | # ... |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 9 | # !dlroW olleH |
| 10 | # |
Guido van Rossum | 7565b93 | 1993-12-17 14:23:52 +0000 | [diff] [blame] | 11 | # The .forw is so you can use anonymous sequences in __init__, and still |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 12 | # keep a reference the forward sequence. ) |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 13 | # If you give it a non-anonymous mutable sequence, the reverse sequence |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 14 | # will track the updated values. ( but not reassignment! - another |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 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 |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 22 | # ... |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 23 | # 2 |
| 24 | # 1 |
| 25 | # 0 |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 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 | # ... |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 30 | # 5 |
| 31 | # 4 |
| 32 | # 2 |
| 33 | # 1 |
| 34 | # 0 |
| 35 | # >>> nnn = nnn[1:-1] |
| 36 | # >>> nnn |
| 37 | # [1, 2, 4] |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 38 | # >>> for n in rnn: print n # prints reversed values of old nnn |
| 39 | # ... |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 40 | # 5 |
| 41 | # 4 |
| 42 | # 2 |
| 43 | # 1 |
| 44 | # 0 |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 45 | # >>> |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 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 |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 52 | # |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 53 | # produces output: |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 54 | # |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 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] |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 58 | # |
| 59 | # >>>rrr = Rev( nnn ) |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 60 | # >>>rrr |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 61 | # <1, 2, 3, 4, 5, 6, 7, 8, 9> |
Guido van Rossum | 102abab | 1993-10-30 12:38:16 +0000 | [diff] [blame] | 62 | |
| 63 | from string import joinfields |
| 64 | class Rev: |
Andrew M. Kuchling | 946c53e | 2003-04-24 17:13:18 +0000 | [diff] [blame] | 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:] |