Sé que esto se puede hacer fácilmente en un bucle for, pero creo que debe haber una forma intuitiva de hacerlo en 1 línea. Para obtener más explicaciones, se le dan dos listas, "jugo" y "capacidad". jugo muestra cuánto jugo tiene un determinado índice y capacidad muestra la capacidad del índice. Estoy tratando de encontrar el índice con la mayor capacidad restante. Así que traté de hacer eso haciendo esto:

maxCap = max(capacity[i] - juice[i] for i in range (0, N - 1))

Pero, por supuesto, esto no guarda el índice. ¿Cómo puedo asignar maxCap a la "i" que produce el maxCap como he escrito?

0
Willy Gorfman 15 ene. 2021 a las 00:29

2 respuestas

La mejor respuesta
maxCap = max(capacity[i] - juice[i] for i in range (0, N - 1))

Esto mismo se puede hacer más simple de esta manera (aunque no entiendo la parte N-1, así que la estoy ignorando):

maxCap = max(c - j for c, j in zip(capacity, juice))

Aún así, eso da el resultado, no el índice. Para encontrar el índice, max tiene que pasar por los valores de i, en lugar de los resultados calculados, pero maximizar los resultados, así:

max_index = max(range(N), key=lambda i: capacity[i] - juice[i])

Por otro lado, si busca eficiencia, esto es bueno para numpy. Si tanto juice como capacity son matrices numpy, entonces esto se puede hacer:

max_diff = (a - b).max()
max_index = (a - b).argmax()
0
zvone 14 ene. 2021 a las 21:34

Puede usar reduce:

import functools
remainings = [capacity[i] - juice[i] for i in range (0, len(capacity) - 1)]
maxCap = functools.reduce(lambda acc, cur: acc if remainings[acc] > remainings[cur] else cur, range(len(remainings)), 0)

Reducir itera sobre el iterable y devuelve un único resultado determinado por la función reductora dada.

0
sardok 14 ene. 2021 a las 22:07
65727171