| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  | '''
 | 
					
						
							|  |  |  | 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 | 
					
						
							| 
									
										
										
										
											1993-10-30 12:38:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  | >>> 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> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | '''
 | 
					
						
							| 
									
										
										
										
											1993-10-30 12:38:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Rev: | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  |     def __init__(self, seq): | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |         self.forw = seq | 
					
						
							|  |  |  |         self.back = self | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __len__(self): | 
					
						
							|  |  |  |         return len(self.forw) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __getitem__(self, j): | 
					
						
							|  |  |  |         return self.forw[-(j + 1)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |         seq = self.forw | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  |         if isinstance(seq, list): | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |             wrap = '[]' | 
					
						
							|  |  |  |             sep = ', ' | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  |         elif isinstance(seq, tuple): | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |             wrap = '()' | 
					
						
							|  |  |  |             sep = ', ' | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  |         elif isinstance(seq, str): | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |             wrap = '' | 
					
						
							|  |  |  |             sep = '' | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             wrap = '<>' | 
					
						
							|  |  |  |             sep = ', ' | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  |         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() |