Eine andere Möglichkeit, in einer einzigen Schleife zu tun, aber ohne auf 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
Dies könnte auch in einer Art und Weise mit reduce
Einzeiler erfolgen:
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]
In Python 3 nicht Tupeln in der lambda
Argumente Definition entpacken kann, so ist es vorzuziehen, um die Funktion zu definieren, unter Verwendung von def
zuerst:
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]
In jedem der drei Fälle, max_start
gibt Ihre Antwort (dh 2
).