Камелия обнови решението на 14.03.2013 21:47 (преди над 11 години)
+import itertools
+import collections
+
+
+def groupby(func, seq):
+ result = {}
+ for arg in seq:
+ key = func(arg)
+ if result.__contains__(key):
+ result[key].append(arg)
+ else:
+ result[key] = [arg]
+ return result
+
+
+def compose(func, composite_func):
+ return lambda x: func(composite_func(x))
+
+
+def iterate(func):
+ composite_func = lambda x: x
+ yield composite_func
+ for i in itertools.count():
+ composite_func = compose(func, composite_func)
+ yield composite_func
+
+
+def zip_with(func, *iterables):
+ for args in zip(*iterables):
+ yield func(*args)
+
+
+def check_cache(func, cached_results, x):
+ for result in cached_results:
+ if result[0] == x:
+ return result[1]
+ result = func(x)
+ cached_results.append((x, result))
+ return result
+
+
+def cache(func, cache_size):
+ cached_results = collections.deque(maxlen=cache_size)
+ return lambda x: check_cache(func, cached_results, x)
Добро решение, като цяло. Защо ползваш result.__contains__(key)
, вместо key in result
?
Нямам приличен отговор, освен, че още се уча да мисля на python - просто не се сетих, въпреки че моят вариант ми стои грозновато. И в останалите три функции имаше доста странни неща, надявам се поне повечето да съм ги премахнала - разликата е, че за тях тестовете ми не минаваха в началото, докато тестовете за groupby
минаха от първия път и не я мислих много след това.