diff --git a/python/builtins.py b/python/builtins.py index 118845f7..41d7f669 100644 --- a/python/builtins.py +++ b/python/builtins.py @@ -56,17 +56,23 @@ def filter(f, iterable): yield i def zip(a, b): - for i in range(min(len(a), len(b))): - yield (a[i], b[i]) + a = iter(a) + 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): a = list(iterable) a.reverse() return a -def sorted(iterable, reverse=False): +def sorted(iterable, reverse=False, key=None): a = list(iterable) - a.sort(reverse=reverse) + a.sort(reverse=reverse, key=key) return a ##### 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]) + ']' 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; mid = a[(R+L)//2]; + mid = key(mid) i, j = L, R while i<=j: - while a[i]mid: j-=1 + while key(a[i])mid: j-=1 if i<=j: a[i], a[j] = a[j], a[i] i+=1 j-=1 - __qsort(a, L, j) - __qsort(a, i, R) + __qsort(a, L, j, key) + __qsort(a, i, R, key) -def list@sort(self, reverse=False): - __qsort(self, 0, len(self)-1) +def list@sort(self, reverse=False, key=None): + if key is None: + key = lambda x:x + __qsort(self, 0, len(self)-1, key) if reverse: self.reverse() diff --git a/src/repl.h b/src/repl.h index 3932755f..a582834e 100644 --- a/src/repl.h +++ b/src/repl.h @@ -69,7 +69,7 @@ public: need_more_lines = 0; line = buffer; buffer.clear(); - mode = EXEC_MODE; + mode = CELL_MODE; }else{ return true; } diff --git a/tests/05_list.py b/tests/05_list.py index 31642ea9..2e5a740e 100644 --- a/tests/05_list.py +++ b/tests/05_list.py @@ -62,4 +62,16 @@ l.insert(0, 'h') l.insert(3, 'o') l.insert(1, 'e') assert l == ['h', 'e', 'l', 'l', 'o'] -assert l[-2] == 'l' \ No newline at end of file +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)] \ No newline at end of file