Explorar el Código

impl sort(key)

BLUELOVETH hace 2 años
padre
commit
0bd413b337
Se han modificado 3 ficheros con 34 adiciones y 13 borrados
  1. 20 11
      python/builtins.py
  2. 1 1
      src/repl.h
  3. 13 1
      tests/05_list.py

+ 20 - 11
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: i+=1
-        while a[j]>mid: j-=1
+        while key(a[i])<mid: i+=1
+        while key(a[j])>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()
 

+ 1 - 1
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;
             }

+ 13 - 1
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'
+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)]