impl sort(key)

This commit is contained in:
BLUELOVETH 2023-05-28 18:19:23 +08:00
parent a421377116
commit 0bd413b337
3 changed files with 34 additions and 13 deletions

View File

@ -56,17 +56,23 @@ def filter(f, iterable):
yield i yield i
def zip(a, b): def zip(a, b):
for i in range(min(len(a), len(b))): a = iter(a)
yield (a[i], b[i]) b = iter(b)
while True:
ai = next(a)
bi = next(b)
if ai is StopIteration or bi is StopIteration:
break
yield ai, bi
def reversed(iterable): def reversed(iterable):
a = list(iterable) a = list(iterable)
a.reverse() a.reverse()
return a return a
def sorted(iterable, reverse=False): def sorted(iterable, reverse=False, key=None):
a = list(iterable) a = list(iterable)
a.sort(reverse=reverse) a.sort(reverse=reverse, key=key)
return a return a
##### str ##### ##### str #####
@ -110,22 +116,25 @@ tuple.__repr__ = lambda self: '(' + ', '.join([repr(i) for i in self]) + ')'
list.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']' list.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
tuple.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']' tuple.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
def __qsort(a: list, L: int, R: int): def __qsort(a: list, L: int, R: int, key):
if L >= R: return; if L >= R: return;
mid = a[(R+L)//2]; mid = a[(R+L)//2];
mid = key(mid)
i, j = L, R i, j = L, R
while i<=j: while i<=j:
while a[i]<mid: i+=1 while key(a[i])<mid: i+=1
while a[j]>mid: j-=1 while key(a[j])>mid: j-=1
if i<=j: if i<=j:
a[i], a[j] = a[j], a[i] a[i], a[j] = a[j], a[i]
i+=1 i+=1
j-=1 j-=1
__qsort(a, L, j) __qsort(a, L, j, key)
__qsort(a, i, R) __qsort(a, i, R, key)
def list@sort(self, reverse=False): def list@sort(self, reverse=False, key=None):
__qsort(self, 0, len(self)-1) if key is None:
key = lambda x:x
__qsort(self, 0, len(self)-1, key)
if reverse: if reverse:
self.reverse() self.reverse()

View File

@ -69,7 +69,7 @@ public:
need_more_lines = 0; need_more_lines = 0;
line = buffer; line = buffer;
buffer.clear(); buffer.clear();
mode = EXEC_MODE; mode = CELL_MODE;
}else{ }else{
return true; return true;
} }

View File

@ -63,3 +63,15 @@ l.insert(3, 'o')
l.insert(1, 'e') l.insert(1, 'e')
assert l == ['h', 'e', 'l', 'l', 'o'] assert l == ['h', 'e', 'l', 'l', 'o']
assert l[-2] == 'l' assert l[-2] == 'l'
# test sort
a = [8, 2, 4, 2, 9]
assert sorted(a) == [2, 2, 4, 8, 9]
assert sorted(a, reverse=True) == [9, 8, 4, 2, 2]
assert sorted(a, key=lambda x:-x, reverse=True) == [2, 2, 4, 8, 9]
assert a == [8, 2, 4, 2, 9]
b = [(1, 2), (3, 3), (5, 1)]
b.sort(key=lambda x:x[1])
assert b == [(5, 1), (1, 2), (3,3)]