¿Cómo agregar valor a una tupla?

79

Estoy trabajando en un guión donde tengo una lista de tuplas como ('1','2','3','4'). p.ej:

list = [('1','2','3','4'),
        ('2','3','4','5'),
        ('3','4','5','6'),
        ('4','5','6','7')]

Ahora tengo que añadir '1234', '2345', '3456'y '4567'respectivamente, al final de cada tupla. p.ej:

list = [('1','2','3','4','1234'),
        ('2','3','4','5','2345'),
        ('3','4','5','6','3456'),
        ('4','5','6','7','4567')]

¿Es posible de alguna manera?

Shahzad
fuente
8
solución multilingüe? ;)
Snowbear
2
¡Bienvenido a StackOverflow! A la derecha, cuando estaba haciendo su pregunta, había este útil cuadro de Cómo formatear . Vale la pena leerlo, ya que la página vinculada desde [?] Justo encima del área de preguntas.
TJ Crowder
3
Al menos en Python, las tuplas son inmutables. Si desea "agregar algo a una tupla", ¿por qué no utilizar una estructura de datos mutable desde el principio?
Felix Kling
2
Yo también lo hago, la mayoría de las veces con "archivo", ¡porque "para archivo en archivos" es muy natural! - pero en general probablemente debería evitar llamar a sus listas "lista", que reemplaza la "lista" incorporada.
DSM

Respuestas:

137

Las tuplas son inmutables y no se supone que se cambien, para eso es el tipo de lista. Podría reemplazar cada tupla por originalTuple + (newElement,), creando así una nueva tupla. Por ejemplo:

t = (1,2,3)
t = t + (1,)
print t
(1,2,3,1)

Pero prefiero sugerir ir con listas desde el principio, porque son más rápidas para insertar elementos.

Y otra pista: no sobrescriba el nombre incorporado listen su programa, más bien llame a la variable lo algún otro nombre. Si sobrescribe el nombre integrado, ya no podrá usarlo en el ámbito actual.

AndiDog
fuente
23
Una taquigrafíat += 1,
1
Excelentes puntos, sin embargo, estoy en la desafortunada situación en la que quiero agregar valores iterativamente a una sqlite3base de datos y necesito hacer una tupla de los valores para agregar (ya que la sintaxis requerida es VALUES (v1, v2, v3, ...). En este caso, saber cómo agregar valores a un tupla es muy beneficioso.
HS-nebula
16

Según la sintaxis, supongo que esto es Python. El punto de una tupla es que es inmutable, por lo que debe reemplazar cada elemento con una nueva tupla:

list = [l + (''.join(l),) for l in list]
# output:
[('1', '2', '3', '4', '1234'), 
 ('2', '3', '4', '5', '2345'), 
 ('3', '4', '5', '6', '3456'), 
 ('4', '5', '6', '7', '4567')]
atp
fuente
5
Esto funciona, seguro. ¿Pero debería hacerse esto realmente? Me pregunto. Porque esto frustra el propósito de tener una tupla en primer lugar. ¿O me equivoco?
user225312
9

En Python, no puedes. Las tuplas son inmutables.

Sin embargo , en la lista de contenido, puede reemplazar la tupla ('1', '2', '3', '4')con una ('1', '2', '3', '4', '1234')tupla diferente .

Pablo Santa Cruz
fuente
9

Como se mencionó en otras respuestas, las tuplas son inmutables una vez creadas, y una lista podría servir mejor a sus propósitos.

Dicho esto, otra opción para crear una nueva tupla con elementos adicionales es usar el operador splat:

new_tuple = (*old_tuple, 'new', 'items')

Me gusta esta sintaxis porque parece una nueva tupla, por lo que comunica claramente lo que está tratando de hacer.

Usando splat, una posible solución es:

list = [(*i, ''.join(i)) for i in list]

Terrabits
fuente
7

Como han respondido otras personas, las tuplas en Python son inmutables y la única forma de 'modificar' una es crear una nueva con los elementos adjuntos incluidos.

Pero la mejor solución es una lista. Cuando sea necesario llamar a cualquier función o método que requiera una tupla, cree una tupla utilizando tuple (lista).

Ryan
fuente
4

Estaba repasando algunos detalles relacionados con tupley list, y lo que entendí es:

  • Las tuplas son Heterogeneoustipo de datos de colección
  • La tupla tiene longitud fija (por tipo de tupla)
  • Las tuplas son siempre finitas

Por lo tanto, para agregar un nuevo elemento a una tupla, debe convertirlo en listy realizar una append()operación en él, luego volver a convertirlo en tupla.

Pero personalmente lo que sentía acerca de la pregunta es, si tuplas se supone que son finitos , de longitud fija artículos y si estamos usando los tipos de datos en nuestras lógicas de aplicación entonces no debería no ser un escenario para anexar nuevos artículos o actualizar un valor del artículo en eso. Entonces, en lugar de una lista de tuplas , debería ser una lista de la propia lista , ¿tengo razón en esto?

Dipak
fuente
1
Hay escenarios en los que necesita pasar una tupla a una función, como con SQL (psycopg2) o interactuando con R (rpy2). Las funciones no siempre funcionan correctamente si se les da una lista en lugar de una tupla. A veces, también recibe una tupla de una función en lugar de una lista. Las tuplas pueden evitar la modificación errónea de una lista original cuando, en cambio, debería estar trabajando en una copia de una lista. Entonces sí, ya sea directa o indirectamente, las listas son intermediarias en las respuestas presentadas. Sin embargo, volver a una tupla al final sigue siendo lógico en muchos escenarios.
Nate Wanner
2
    list_of_tuples = [('1', '2', '3', '4'),
                      ('2', '3', '4', '5'),
                      ('3', '4', '5', '6'),
                      ('4', '5', '6', '7')]


    def mod_tuples(list_of_tuples):
        for i in range(0, len(list_of_tuples)):
            addition = ''
            for x in list_of_tuples[i]:
                addition = addition + x
            list_of_tuples[i] = list_of_tuples[i] + (addition,)
        return list_of_tuples

    # check: 
    print mod_tuples(list_of_tuples)
Viktor
fuente
0
OUTPUTS = []
for number in range(len(list_of_tuples))):
    tup_ = list_of_tuples[number]
    list_ = list(tup_)  
    item_ = list_[0] + list_[1] + list_[2] + list_[3]
    list_.append(item_)
    OUTPUTS.append(tuple(list_))

SALIDAS es lo que deseas

Questwalker
fuente