Tengo una tupla de 3 elementos donde uno de los elementos es diferente de los otros dos. Por ejemplo, podría ser algo como: (0.456, 0.768, 0.456).

¿Cuál es la forma más fácil de encontrar el índice de este elemento diferente? Una forma en la que puedo pensar es considerar el índice (0, 1) y (1, 2) y uno de estos será diferente. Si es (0, 1), compare sus elementos con el elemento en 2 de lo contrario, compare los elementos de (1, 2) con el índice 0 para encontrar el elemento diferente.

Siento que me falta una forma pitónica de hacer esto.

3
Luca 4 oct. 2019 a las 11:46

4 respuestas

La mejor respuesta

Podría contar las ocurrencias de cada elemento en la lista y luego encontrar el índice del lugar donde solo existe un elemento, pero tengo la sensación de que esto puede no ser tan eficaz como su solución. Tampoco funcionaría si los 3 valores son distintos.

my_tuple[[my_tuple.count(x) for x in my_tuple].index(1)]
4
Sayse 4 oct. 2019 a las 08:58

Lo que puede parecer una gran exageración en Python 3, pero no pudo evitar publicar:

import collections
a = (0.768, 0.456, 0.456)
print("Dissimilar object index: ", a.index(list(collections.Counter(a).keys())[list(collections.Counter(a).values()).index(1)]))

Explicación:

collections.Counter(a): devolverá un dict de frecuencia, por ejemplo, {0.768:1, 0.456:2}, etc. Luego, simplemente creamos una lista para aprovechar index(1) para descubrir el valor que es extraño. Luego usamos a.index(odd_one_out_val) para encontrar el índice.

1
Rakib 4 oct. 2019 a las 09:18

Podrías probar esto:

index = [my_tuple.index(i) for i in my_tuple if my_tuple.count(i) == 1][0]

Sin embargo, no estoy seguro de que sea un gran rendimiento.

2
ImranD 4 oct. 2019 a las 08:57

Un enfoque simple:

def func(x):
    a = x[0] == x[2]
    b = x[0] == x[1]
    return a + 2 * b

func(('A', 'B', 'A'))
# 1
5
Mykola Zotko 18 ene. 2020 a las 09:13
58232887