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.

1
alvas 10 dic. 2015 a las 20:40

4 respuestas

La mejor respuesta

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]))))
3
Morgan Thrapp 10 dic. 2015 a las 18:21
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])
1
Xavier Combelle 10 dic. 2015 a las 18:39

Aquí hay una alternativa, ofrecida sin comentarios sobre eficiencia:

y = [abs(item[0]) for item in x]
m = max(y)
print(y.index(m))
1
Riccati 10 dic. 2015 a las 18:14

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
0
Iron Fist 22 dic. 2015 a las 06:31