Innym sposobem robi w pojedynczej pętli, ale bez uciekania się do itertool
's groupby
.
max_start = 0
max_reps = 0
start = 0
reps = 0
for (pos, val) in enumerate(a1):
start = pos if reps == 0 else start
reps = reps + 1 if val == 1 else 0
max_reps = max(reps, max_reps)
max_start = start if reps == max_reps else max_start
To może być również wykonane w sposób jedno-liner użyciu reduce
:
max_start = reduce(lambda (max_start, max_reps, start, reps), (pos, val): (start if reps == max(reps, max_reps) else max_start, max(reps, max_reps), pos if reps == 0 else start, reps + 1 if val == 1 else 0), enumerate(a1), (0, 0, 0, 0))[0]
W Pythonie 3, nie można rozpakować krotki wewnątrz definicji lambda
argumenty, więc lepiej jest zdefiniować funkcję używając def
pierwszy:
def func(acc, x):
max_start, max_reps, start, reps = acc
pos, val = x
return (start if reps == max(reps, max_reps) else max_start,
max(reps, max_reps),
pos if reps == 0 else start,
reps + 1 if val == 1 else 0)
max_start = reduce(func, enumerate(a1), (0, 0, 0, 0))[0]
W każdym z trzech przypadków max_start
daje odpowiedź (tj 2
).