Bessere Lösung für iter_pare_sum() ???
Verfasst: Freitag 23. August 2013, 12:44
Weiß jemand wie man iter_pare_sum() besser machen kann?
Finde die Lösung mit skip dumm.
Es geht darum, das immer die Summe des am näher liegenden Pärchen gemacht wird. Wenn sich ein Ausreißer dazwischen schummelt, soll es danach wieder mit den besten Pärchen weiter gehen...
EDIT: Funktion iter_window bei gepackt. Um die geht es allerdings nicht. Gern auch eine Lösung ohne dem.
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.