mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
impl sort(key)
This commit is contained in:
parent
a421377116
commit
0bd413b337
@ -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()
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -62,4 +62,16 @@ l.insert(0, 'h')
|
|||||||
l.insert(3, 'o')
|
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)]
|
Loading…
x
Reference in New Issue
Block a user