Soy nuevo en Python, por lo que esta pregunta podría ser un poco básica. Tengo una tupla llamada values
que contiene lo siguiente:
('275', '54000', '0.0', '5000.0', '0.0')
Quiero cambiar el primer valor (es decir, 275
) en esta tupla, pero entiendo que las tuplas son inmutables, por values[0] = 200
lo que no funcionarán. ¿Cómo puedo conseguir esto?
Respuestas:
Primero debes preguntar, ¿por qué quieres hacer esto?
Pero es posible a través de:
Pero si va a necesitar cambiar las cosas, probablemente sea mejor que lo mantenga como
list
fuente
Dependiendo de su problema, cortar en rodajas puede ser una buena solución:
Esto le permite agregar varios elementos o también reemplazar algunos elementos (especialmente si son "vecinos". En el caso anterior, la conversión a una lista es probablemente más apropiada y legible (aunque la notación de corte es mucho más corta).
fuente
Bueno, como Trufa ya ha mostrado, hay básicamente dos formas de reemplazar el elemento de una tupla en un índice dado. Convierta la tupla en una lista, reemplace el elemento y vuelva a convertir, o construya una nueva tupla por concatenación.
Entonces, ¿qué método es mejor, es decir, más rápido?
¡Resulta que para tuplas cortas (en Python 3.3), la concatenación es en realidad más rápida!
Sin embargo, si observamos tuplas más largas, la conversión de listas es el camino a seguir:
Para tuplas muy largas, la conversión de listas es sustancialmente mejor.
Además, el rendimiento del método de concatenación depende del índice en el que reemplazamos el elemento. Para el método de lista, el índice es irrelevante.
Entonces: si su tupla es corta, corte y concatene. Si es largo, ¡haz la conversión de la lista!
fuente
Es posible con una sola línea:
fuente
values
con esto?i = 2; values = (*values[:i], '300', *values[i+1:])
No es que esto sea superior, pero si alguien tiene curiosidad se puede hacer en una línea con:
fuente
tuple = tuple(200 if i == 0 else _ for i, _ in enumerate(tuple))
? (¿Por qué no la comprensión del generador?)Creo que técnicamente esto responde a la pregunta, pero no hagas esto en casa. Por el momento, todas las respuestas implican la creación de una nueva tupla, pero puede usarla
ctypes
para modificar una tupla en la memoria. Basándose en varios detalles de implementación de CPython en un sistema de 64 bits, una forma de hacerlo es la siguiente:fuente
Como escribió Hunter McMillen en los comentarios, las tuplas son inmutables, es necesario crear una nueva tupla para lograr esto. Por ejemplo:
fuente
EDITAR: ¡¡Esto todavía no funciona en tuplas con entradas duplicadas !!
Basado en la idea de Pooya :
Si planeas hacer esto a menudo (lo cual no deberías ya que las tuplas son inmutables por una razón), debes hacer algo como esto:
O basado en la idea de Jon :
fuente
Primero, pregúntese por qué quiere mutar su
tuple
. Hay una razón por la que las cadenas y la tupla son inmutables en Ptyhon , si desea mutar su,tuple
entonces probablemente debería ser alist
.En segundo lugar, si aún desea mutar su tupla, puede convertir su
tuple
a,list
luego volver a convertirla y reasignar la nueva tupla a la misma variable. Esto es genial si solo vas a mutar tu tupla una vez . De lo contrario, personalmente creo que es contradictorio. Porque esencialmente está creando una nueva tupla y cada vez que desee mutar la tupla, tendrá que realizar la conversión. Además, si lee el código, sería confuso pensar ¿por qué no simplemente crear unlist
? Pero es bueno porque no requiere ninguna biblioteca.Sugiero usar
mutabletuple(typename, field_names, default=MtNoDefault)
desde mutabletuple 0.2 . Personalmente creo que esta forma es más intuitiva y legible. La persona que lea el código sabrá que el escritor tiene la intención de mutar esta tupla en el futuro. La desventaja en comparación con ellist
método de conversión anterior es que esto requiere que importe un archivo py adicional.TL; DR : No intentes mutar
tuple
. si lo hace y es una operación de una sola vez, conviértalatuple
en lista, muétela, conviértalalist
en una nuevatuple
y reasigne de nuevo a la variable que contiene la antiguatuple
. Si deseatuple
y de alguna manera quiere evitarlist
y quiere mutar más de una vez, creemutabletuple
.fuente
basado en la Idea de Jon y la querida Trufa
cambia todas las ocurrencias de valores antiguos
fuente
No puedes. Si desea cambiarlo, debe usar una lista en lugar de una tupla.
Tenga en cuenta que, en cambio, podría crear una nueva tupla que tenga el nuevo valor como primer elemento.
fuente
He descubierto que la mejor manera de editar tuplas es recrear la tupla usando la versión anterior como base.
Aquí hay un ejemplo que usé para hacer una versión más clara de un color (ya lo tenía abierto en ese momento):
Lo que hace es pasar por el 'color' de la tupla y leer cada elemento, hacer algo y finalmente agregarlo a la nueva tupla.
Entonces, lo que querrías sería algo como:
Ese específico no funciona, pero el concepto es lo que necesitas.
ese es el concepto.
fuente
Llego tarde al juego, pero creo que la forma más sencilla , fácil de usar y rápida (dependiendo de la situación) es sobrescribir la propia tupla. Dado que esto eliminaría la necesidad de la creación de listas y variables y se archiva en una línea.
Pero: Esto solo es útil para tuplas bastante pequeñas y también lo limita a un valor de tupla fijo, sin embargo, este es el caso de las tuplas la mayor parte del tiempo.
Entonces, en este caso particular, se vería así:
fuente
tldr; la "solución alternativa" es crear un nuevo objeto de tupla, no modificar el original
Si bien esta es una pregunta muy antigua, alguien me habló de esta locura de tuplas mutantes de Python. Lo cual me sorprendió / intrigó mucho, y al buscar en Google, aterricé aquí (y otras muestras similares en línea)
Hice una prueba para probar mi teoría
Note
==
valora la igualdad mientrasis
que la igualdad referencial (es obj a la misma instancia que obj b)Rendimientos:
fuente
No puede modificar elementos en tuplas, pero puede modificar propiedades de objetos mutables en tuplas (por ejemplo, si esos objetos son listas u objetos de clase reales)
Por ejemplo
fuente
hice esto:
y para cambiar, solo hazlo
y puedes cambiar una tupla: D
aquí está copiado exactamente de IDLE
fuente
x = (y)
no hace nada más que asigna y a x.Puede cambiar el valor de la tupla usando copiar por referencia
fuente