Python agrega elemento a la tupla

160

Tengo algunos object.ID-s que trato de almacenar en la sesión del usuario como tupla. Cuando agrego el primero, funciona, pero parece tupla, (u'2',)pero cuando trato de agregar uno nuevo con mytuple = mytuple + new.iderror conseguido can only concatenate tuple (not "unicode") to tuple.

Goran
fuente

Respuestas:

294

Necesita hacer que el segundo elemento sea una tupla, por ejemplo:

a = ('2',)
b = 'z'
new = a + (b,)
Jon Clements
fuente
11
¿Por qué necesitas esta coma?
SIslam
32
@SIslam Sin la coma, solo se interpretará como corchetes que generalmente se usan para sortear el orden de precedencia:(a+b)*c
Joseph Young,
2
Sí, pero puedes hacerlo en new = a + blugar de new = a + (b,). AFAICT, funciona igual en python3 y python2.7.
ILMostro_7
55
@ ILMostro_7 depende de qué es b
Jon Clements
O en breve a += ('z',), como se menciona en la siguiente respuesta
artu-hnrq
54

Desde Python 3.5 ( PEP 448 ) puede desempacar dentro de una tupla, un conjunto de listas y un dict:

a = ('2',)
b = 'z'
new = (*a, b)
nitely
fuente
33

De tupla a lista a tupla:

a = ('2',)
b = 'b'

l = list(a)
l.append(b)

tuple(l)

O con una lista más larga de elementos para agregar

a = ('2',)
items = ['o', 'k', 'd', 'o']

l = list(a)

for x in items:
    l.append(x)

print tuple(l)

te dio

>>> 
('2', 'o', 'k', 'd', 'o')

El punto aquí es: La lista es un tipo de secuencia mutable . Por lo tanto, puede cambiar una lista dada agregando o eliminando elementos. La tupla es un tipo de secuencia inmutable . No puedes cambiar una tupla. Entonces tienes que crear uno nuevo .

Kiriloff
fuente
55
Esto será el doble de lento que simplemente agregando dos tuplas
jamylak
2
Sin embargo, si le indica a OP que realice la conversión al listprincipio, agregue elementos y luego, al final, convierta a tuplecontinuación, esta es la mejor solución +1
jamylak
dos elementos, incluida la primera lista de itemin. pero tienes razón, debería agregar un ejemplo más largo = lista, mira mi edición
kiriloff
13

Tuple solo puede permitir agregarle tuple. La mejor manera de hacerlo es:

mytuple =(u'2',)
mytuple +=(new.id,)

Intenté el mismo escenario con los datos a continuación, todo parece estar funcionando bien.

>>> mytuple = (u'2',)
>>> mytuple += ('example text',)
>>> print mytuple
(u'2','example text')
usuario3798348
fuente
11
>>> x = (u'2',)
>>> x += u"random string"

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    x += u"random string"
TypeError: can only concatenate tuple (not "unicode") to tuple
>>> x += (u"random string", )  # concatenate a one-tuple instead
>>> x
(u'2', u'random string')
jamylak
fuente
2

Formulario # 1

a = ('x', 'y')
b = a + ('z',)
print(b)

Formulario # 2

a = ('x', 'y')
b = a + tuple('b')
print(b)
britodfbr
fuente
La segunda opción no funciona. TypeError: 'int' object is not iterable
Obi Wan - PallavJha
1

En pocas palabras, la forma más fácil de agregar una tupla es encerrar el elemento que se agrega entre paréntesis y una coma.

t = ('a', 4, 'string')
t = t + (5.0,)
print(t)

out: ('a', 4, 'string', 5.0)
alphahmed
fuente