Finde die Lösung mit skip dumm.
Code: Alles auswählen
def iter_window(g, window_size):
"""
interate over 'g' bit-by-bit and yield a window with the given 'window_size' width.
>>> for v in iter_window([1,2,3,4], window_size=2): v
[1, 2]
[2, 3]
[3, 4]
>>> for v in iter_window([1,2,3,4,5], window_size=3): v
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
>>> for v in iter_window([1,2,3,4], window_size=2):
... v
... v.append(True)
[1, 2]
[2, 3]
[3, 4]
"""
values = collections.deque(maxlen=window_size)
for value in g:
values.append(value)
if len(values) == window_size:
yield list(values)
def iter_pare_sum(data):
"""
>>> def g(data):
... for i in data: yield i
>>> list(iter_pare_sum(g([5,5,10,10,4,4,10,10,5,5])))
[20, 8, 20, 10]
>>> list(iter_pare_sum([5,10,10,4,4,10,10,5,5,10]))
[20, 8, 20, 10]
>>> list(iter_pare_sum([5,4,10,11,5,4,21,22,2,1]))
[21, 9, 43, 3]
>>> list(iter_pare_sum([
... 5,5,10,10,5,5,
... 5, # <- resync 1
... 8,8,5,5,10,10,
... 10, # <- resync 2
... 7,7,5,5,10,10,2,2,3,3
... ]))
[20, 10, 10, 16, 10, 20, 14, 10, 20, 4, 6]
resync ^ ^
"""
skip = True
for previous, current, next_value in iter_window(data, window_size=3):
if skip:
skip = False
continue
skip = True
diff1 = abs(previous - current)
diff2 = abs(current - next_value)
if diff1 < diff2:
yield previous + current
else:
yield current + next_value
if __name__ == "__main__":
import doctest
print doctest.testmod()
EDIT: Funktion iter_window bei gepackt. Um die geht es allerdings nicht. Gern auch eine Lösung ohne dem.