Traté de resolver el siguiente problema a través de la comprensión de la lista, pero no pude hacerlo funcionar. Le mostraré cómo resolví el problema usando un bucle y una lista de comprensión.

Entonces, tengo una lista que puede tener de 0 a 6 elementos en un rango (6) y cuando aplico mi función en ella quiero cambiar los valores, como se muestra aquí:

l = [0, 1, 2, 3, 4, 5]
mirror = [5, 4, 3, 2, 1, 0]

No quiero simplemente girar la matriz 180 grados, sino que realmente quiero reemplazar los valores. Por ejemplo, mi lista se ve así ahora:

l = [2, 5]

Entonces l_inverted list debería verse así:

l_inverted = [3, 0]

Se me ocurrió una forma regular de resolverlo, pero desde que comencé a aprender Python, he preferido comprender las listas.

l = [0, 3, 5]
mirror = [5, 4, 3, 2, 1, 0]
i = 0
for element in l:
    l[i] = mirror[element]
    i += 1

Esto realmente invierte la lista l. Aquí está mi enfoque usando una lista de comprensión:

l = [3, 5]
mirror = [5, 4, 3, 2, 1, 0]
for element in l:
    print(element)
    l = [mirror[element] if x==element else x for x in l]

Esto funciona bien Hasta:

l = [0, 3, 5]
mirror = [5, 4, 3, 2, 1, 0]
for element in l:
    print(element)
    l = [mirror[element] if x==element else x for x in l]

Por lo tanto, reemplazará 5 con 0, 2 con 3 y ambos 5 (el nuevo también) se convierten en 0. Obviamente, no lo quiero así.

¿Debo apegarme a la solución de trabajo o hay una manera fácil de resolverlo con listas de comprensión? Estoy tratando de practicar las comprensiones de listas en todo momento, pero aún no está completamente en mi cerebro. Muchas gracias.

3
Marc 28 feb. 2018 a las 20:05

3 respuestas

La mejor respuesta

Si lo quieres como una lista de comprensión:

>> l = [0, 3, 5]
>> mirror = [5, 4, 3, 2, 1, 0]
>> l_inverted = [mirror[x] for x in l]
>> l_inverted
[5, 2, 0]
1
DBedrenko 28 feb. 2018 a las 17:12

Según sus dos primeros ejemplos, parece que está buscando el complemento de cada valor de lista de acuerdo con alguna base, similar a complemento de unos. Puede codificar la base como 5 o lo que sea, o puede suponer que es el número máximo en la lista y calcularlo. Aquí hay una solución para esto último:

Concepto

<this complement> = <max value in list> - <this value>

Código

values = [0, 3, 2, 4, 5]
max_value = max(values)
complements = [max_value - value for value in values]
print complements

Resultado

[5, 2, 3, 1, 0]
1
MarredCheese 4 sep. 2019 a las 20:38

Te estás ahogando en una cucharada de agua e intentas llevarnos contigo. Está utilizando convenciones de nombres erróneos que hacen que su simple problema sea complicado de comprender.

orig = [0, 1, 2, 3, 4, 5]
orig_rev = l[::-1]

selector = [0, 3, 5]

result = [orig_rev[i] for i in selector]
print(result )  # [5, 2, 0]
2
Ev. Kounis 28 feb. 2018 a las 17:13