Dada una lista de tuplas:
[(-8.33958, -84.01769099999999), (-7.96129, -84.37399199999999), (-8.33958, -83.84126699999999), (-7.96129, -84.19756499999998), (-7.24097, -85.581651), (-6.86267, -85.937952), (-7.24097, -85.405227), (-6.86267, -85.76152499999999), (-9.4382, -83.473767), (-9.4382, -83.473767), (-8.35625, -85.11197399999999), (-9.0599, -83.83006499999999), (-9.0599, -83.83006499999999), (-7.97795, -85.46824499999998), (-8.35625, -84.93524699999999), (-7.97795, -85.29151799999998), (-8.33958, -85.03772699999999), (-8.00311, -88.17046199999997), (-5.88285, -86.59070369999999), (-6.86267, -88.655385), (-9.37174, -86.88101999999999), (-7.34506, -88.24291199999999), (-8.22317, -87.13259099999999), (-7.72054, -86.124309), (-8.35625, -86.131707), (-8.35625, -86.131707), (-7.03703, -88.90182), (-8.51394, -86.422992), (-8.51394, -85.83968999999999), (-9.61255, -85.510092), (-9.89311, -84.10327799999999), (-7.96129, -87.540312), (-9.13791, -86.022645)]
El objetivo es encontrar el índice del valor más alto del primer elemento de la tupla. Con la entrada de ejemplo arriba de la salida, el índice de la tupla (-9.89311, -84.10327799999999)
Lo he estado haciendo como tal (pero no devuelve el resultado correcto):
x = [(-8.33958, -84.01769099999999), (-7.96129, -84.37399199999999), (-8.33958, -83.84126699999999), (-7.96129, -84.19756499999998), (-7.24097, -85.581651), (-6.86267, -85.937952), (-7.24097, -85.405227), (-6.86267, -85.76152499999999), (-9.4382, -83.473767), (-9.4382, -83.473767), (-8.35625, -85.11197399999999), (-9.0599, -83.83006499999999), (-9.0599, -83.83006499999999), (-7.97795, -85.46824499999998), (-8.35625, -84.93524699999999), (-7.97795, -85.29151799999998), (-8.33958, -85.03772699999999), (-8.00311, -88.17046199999997), (-5.88285, -86.59070369999999), (-6.86267, -88.655385), (-9.37174, -86.88101999999999), (-7.34506, -88.24291199999999), (-8.22317, -87.13259099999999), (-7.72054, -86.124309), (-8.35625, -86.131707), (-8.35625, -86.131707), (-7.03703, -88.90182), (-8.51394, -86.422992), (-8.51394, -85.83968999999999), (-9.61255, -85.510092), (-9.89311, -84.10327799999999), (-7.96129, -87.540312), (-9.13791, -86.022645)]
index_of_max_abs_j = -1
for i, (j,k) in enumerate(x):
if j*j > index_of_max_abs_j:
index_of_max_abs_j = i
print index_of_max_abs_j
El código devuelve el índice de max(j*j)
pero ¿es así? ¿Es diferente de tratar de encontrar max(|j|)
?
¿Pero hay otra forma de lograr el mismo resultado? ¿Quizás con sorted
y reverse
y key
con algunos math.abs
? ¿La alternativa con sorted
, reverse
y / o key
es más eficiente?
Si hay algún elemento en la lista de tuplas que tiene el mismo valor, devuelva el primer índice de la primera instancia del valor absoluto máximo.
4 respuestas
No estoy seguro de por qué está comparando el valor del primer elemento de la tupla con el índice, pero esto le da el índice de la tupla con el valor absoluto más alto para el primer elemento.
max_index = -1
max_value = 0
for i, z in enumerate(x):
value = abs(z[0])
if value > max_value:
max_index = i
max_value = value
print(x[max_index])
O como una frase menos legible,
print(x.index(max(x, key=lambda y:abs(y[0]))))
print(max((abs(value[0]),index) for (index,value) in enumerate(values))[1]
Daría el índice del último elemento que tiene el elemento max en una pasada con función nativa, por lo que debería ser la forma más rápida
Si realmente quieres tener el primero de los elementos máximos, puedes hacerlo
print(-max((abs(value[0]),-index) for (index,value) in enumerate(values))[1])
Aquí hay una alternativa, ofrecida sin comentarios sobre eficiencia:
y = [abs(item[0]) for item in x]
m = max(y)
print(y.index(m))
Puede hacerlo en 2 pasos para obtener el máximo basado en la primera clave en el paso 1, luego obtener el índice con el elemento
>>> max_value = sorted(x, key=lambda y: y[0])[0]
>>> x.index(max_value)
30
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.