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.

Antworten:


294

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

a = ('2',)
b = 'z'
new = a + (b,)

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)

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 .


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')

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')

2

# 1 Form

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

# 2 Form

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

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.