Python ajoute un élément au tuple

160

J'ai des object.ID-s que j'essaie de stocker dans la session utilisateur en tant que tuple. Quand j'ajoute le premier, cela fonctionne mais le tuple ressemble à (u'2',)mais quand j'essaye d'en ajouter un nouveau en utilisant mytuple = mytuple + new.idgot error can only concatenate tuple (not "unicode") to tuple.

Goran
la source

Réponses:

294

Vous devez faire du deuxième élément un 1-tuple, par exemple:

a = ('2',)
b = 'z'
new = a + (b,)
Jon Clements
la source
11
Pourquoi vous avez besoin de cette virgule
SIslam
32
@SIslam Sans la virgule, il sera simplement interprété comme des crochets habituellement utilisés pour contourner l'ordre de priorité:(a+b)*c
Joseph Young
2
ouais, mais tu peux le faire à la new = a + bplace new = a + (b,). AFAICT, fonctionne de la même manière en python3 et python2.7.
ILMostro_7
5
@ ILMostro_7 dépend de ce que b est cependant
Jon Clements
Ou brièvement a += ('z',), comme mentionné dans la réponse ci-dessous
artu-hnrq
54

Depuis Python 3.5 ( PEP 448 ), vous pouvez effectuer une décompression dans un tuple, un ensemble de listes et un dict:

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

Du tuple à la liste au tuple:

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

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

tuple(l)

Ou avec une liste plus longue d'éléments à ajouter

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

l = list(a)

for x in items:
    l.append(x)

print tuple(l)

vous donne

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

Le point ici est: La liste est un type de séquence mutable . Vous pouvez donc modifier une liste donnée en ajoutant ou en supprimant des éléments. Tuple est un type de séquence immuable . Vous ne pouvez pas changer un tuple. Vous devez donc en créer un nouveau .

Kiriloff
la source
5
Ce sera deux fois plus lent que d'ajouter simplement deux tuples
jamylak
2
Cependant, si vous notez OP vers lequel convertir listau début, ajoutez des éléments, puis à la toute fin, convertissez-le en tuplealors c'est la meilleure solution +1
jamylak
deux éléments, y compris le premier élément de la liste. mais vous avez raison, je devrais mieux ajouter un exemple de liste = plus long, voir ma modification
kiriloff
13

Tuple ne peut autoriser que des ajouts tuple. La meilleure façon de le faire est:

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

J'ai essayé le même scénario avec les données ci-dessous, tout semble bien fonctionner.

>>> mytuple = (u'2',)
>>> mytuple += ('example text',)
>>> print mytuple
(u'2','example text')
user3798348
la source
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
la source
2

Forme # 1

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

Forme # 2

a = ('x', 'y')
b = a + tuple('b')
print(b)
britodfbr
la source
la deuxième option ne fonctionne pas. TypeError: 'int' object is not iterable
Obi Wan - PallavJha
1

En bout de ligne, le moyen le plus simple d'ajouter à un tuple est de placer l'élément ajouté avec des parenthèses et une virgule.

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

out: ('a', 4, 'string', 5.0)
alphahmed
la source