Python aggiunge l'elemento alla tupla


160

Ho alcuni object.ID-s che provo a memorizzare nella sessione utente come tupla. Quando aggiungo il primo funziona, ma appare la tupla, (u'2',)ma quando provo ad aggiungerne uno nuovo mytuple = mytuple + new.idho ottenuto l'errore can only concatenate tuple (not "unicode") to tuple.

Risposte:


294

Devi rendere il secondo elemento una tupla, ad esempio:

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

11
Perché hai bisogno di questa virgola
SIslam

32
@SIslam Senza la virgola, verrà semplicemente interpretato come parentesi solitamente utilizzate per aggirare l'ordine di precedenza:(a+b)*c
Joseph Young,

2
sì, ma puoi fare new = a + binvece di new = a + (b,). AFAICT, funziona allo stesso modo in python3 e python2.7.
ILMostro_7,

5
@ ILMostro_7 dipende da cosa b è però
Jon Clements

O in breve a += ('z',), come menzionato nella seguente risposta
artu-hnrq

54

Da Python 3.5 ( PEP 448 ) è possibile eseguire il disimballaggio all'interno di una tupla, di un elenco e di un comando:

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

33

Dalla tupla all'elenco alla tupla:

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

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

tuple(l)

O con un elenco più lungo di elementi da aggiungere

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

l = list(a)

for x in items:
    l.append(x)

print tuple(l)

ti dà

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

Il punto qui è: Elenco è un tipo di sequenza mutabile . Quindi puoi cambiare un determinato elenco aggiungendo o rimuovendo elementi. La tupla è un tipo di sequenza immutabile . Non puoi cambiare una tupla. Quindi devi crearne uno nuovo .


5
Questo sarà due volte più lento dell'aggiunta di due tuple
jamylak,

2
Tuttavia, se noti in OP per la conversione listall'inizio, aggiungi elementi e alla fine converti in tupleallora questa è la soluzione migliore +1
jamylak,

due elementi incluso il primo elenco di articoli. ma hai ragione, dovrei aggiungere un esempio più lungo = elenco, vedi la mia modifica
kiriloff

13

Tuple può solo consentire l'aggiunta tuplead esso. Il modo migliore per farlo è:

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

Ho provato lo stesso scenario con i dati seguenti sembra funzionare tutto bene.

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

Modulo n. 1

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

Modulo n. 2

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

la seconda opzione non funziona. TypeError: 'int' object is not iterable
Obi Wan - PallavJha,

1

In conclusione, il modo più semplice di aggiungere a una tupla è racchiudere l'elemento che viene aggiunto tra parentesi e una virgola.

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

out: ('a', 4, 'string', 5.0)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.