72 lines
1.9 KiB
Python
72 lines
1.9 KiB
Python
try:
|
|
reversed = reversed
|
|
except NameError:
|
|
def reversed(sequence):
|
|
"""reversed(sequence) -> reverse iterator over values of the sequence
|
|
|
|
Return a reverse iterator
|
|
"""
|
|
if hasattr(sequence, '__reversed__'):
|
|
return sequence.__reversed__()
|
|
if not hasattr(sequence, '__getitem__'):
|
|
raise TypeError("argument to reversed() must be a sequence")
|
|
return reversed_iterator(sequence)
|
|
|
|
class reversed_iterator(object):
|
|
|
|
def __init__(self, seq):
|
|
self.seq = seq
|
|
self.remaining = len(seq)
|
|
|
|
def __iter__(self):
|
|
return self
|
|
|
|
def next(self):
|
|
i = self.remaining
|
|
if i > 0:
|
|
i -= 1
|
|
item = self.seq[i]
|
|
self.remaining = i
|
|
return item
|
|
raise StopIteration
|
|
|
|
def __length_hint__(self):
|
|
return self.remaining
|
|
|
|
try:
|
|
sorted = sorted
|
|
except NameError:
|
|
builtin_cmp = cmp # need to use cmp as keyword arg
|
|
|
|
def sorted(iterable, cmp=None, key=None, reverse=0):
|
|
use_cmp = None
|
|
if key is not None:
|
|
if cmp is None:
|
|
def use_cmp(x, y):
|
|
return builtin_cmp(x[0], y[0])
|
|
else:
|
|
def use_cmp(x, y):
|
|
return cmp(x[0], y[0])
|
|
l = [(key(element), element) for element in iterable]
|
|
else:
|
|
if cmp is not None:
|
|
use_cmp = cmp
|
|
l = list(iterable)
|
|
if use_cmp is not None:
|
|
l.sort(use_cmp)
|
|
else:
|
|
l.sort()
|
|
if reverse:
|
|
l.reverse()
|
|
if key is not None:
|
|
return [element for (_, element) in l]
|
|
return l
|
|
|
|
try:
|
|
set, frozenset = set, frozenset
|
|
except NameError:
|
|
from sets import set, frozenset
|
|
|
|
# pass through
|
|
enumerate = enumerate
|