Python fügt dem Tupel ein Element hinzu

160

Ich habe einige object.ID-s, die ich als Tupel in der Benutzersitzung zu speichern versuche. Wenn ich das erste hinzufüge, funktioniert es, aber das Tupel sieht so aus, (u'2',)aber wenn ich versuche, ein neues mit mytuple = mytuple + new.idgot error hinzuzufügen can only concatenate tuple (not "unicode") to tuple.

Goran
quelle

Antworten:

294

Sie müssen das zweite Element zu einem 1-Tupel machen, z.

a = ('2',)
b = 'z'
new = a + (b,)
Jon Clements
quelle
11
Warum Sie dieses Komma brauchen
SIslam
32
@ Islam Ohne Komma wird es nur als Klammern interpretiert, die normalerweise verwendet werden, um die Rangfolge zu umgehen:(a+b)*c
Joseph Young
2
Ja, aber du kannst es new = a + bstattdessen tun new = a + (b,). AFAICT funktioniert genauso in Python3 und Python2.7.
ILMostro_7
5
@ ILMostro_7 hängt davon ab, was b ist
Jon Clements
Oder kurz a += ('z',), wie in der folgenden Antwort erwähnt
artu-hnrq
54

Seit Python 3.5 ( PEP 448 ) können Sie das Entpacken innerhalb eines Tupels, eines Listensatzes und eines Diktats durchführen:

a = ('2',)
b = 'z'
new = (*a, b)
endlich
quelle
33

Vom Tupel zur Liste zum Tupel:

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

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

tuple(l)

Oder mit einer längeren Liste von Elementen zum Anhängen

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

l = list(a)

for x in items:
    l.append(x)

print tuple(l)

gibt Ihnen

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

Der Punkt hier ist: Liste ist ein veränderbarer Sequenztyp. Sie können also eine bestimmte Liste ändern, indem Sie Elemente hinzufügen oder entfernen. Tupel ist ein unveränderlicher Sequenztyp. Sie können ein Tupel nicht ändern. Sie müssen also eine neue erstellen .

kiriloff
quelle
5
Dies wird doppelt so langsam sein wie das Hinzufügen von zwei Tupeln
Jamylak
2
Wenn Sie jedoch zu listBeginn feststellen, dass OP konvertiert werden soll , Elemente anhängen und dann ganz am Ende konvertieren, tupleist dies die beste Lösung +1
jamylak
zwei Elemente einschließlich der ersten Elementliste. aber du hast recht, ich sollte besser ein längeres =
listenbeispiel
13

Tupel kann nur das Hinzufügen zulassen tuple. Der beste Weg, dies zu tun, ist:

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

Ich habe das gleiche Szenario mit den folgenden Daten versucht, es scheint alles gut zu funktionieren.

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

# 1 Form

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

# 2 Form

a = ('x', 'y')
b = a + tuple('b')
print(b)
britodfbr
quelle
Die zweite Option funktioniert nicht. TypeError: 'int' object is not iterable
Obi Wan - PallavJha
1

Unterm Strich besteht der einfachste Weg, an ein Tupel anzuhängen, darin, das hinzugefügte Element mit Klammern und einem Komma zu versehen.

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

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