Rev.py revision 102ababef924ced3a495dda4bda6548ad898070d
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 63from string import joinfields 64class 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:] 90