Python добавить элемент в кортеж

160

У меня есть несколько object.ID, которые я пытаюсь сохранить в сеансе пользователя как кортеж. Когда я добавляю первый, он работает, но кортеж выглядит так, (u'2',)но когда я пытаюсь добавить новый, используя mytuple = mytuple + new.idполученную ошибку can only concatenate tuple (not "unicode") to tuple.

Горан
источник

Ответы:

294

Вам нужно сделать второй элемент 1-кортежем, например:

a = ('2',)
b = 'z'
new = a + (b,)
Джон Клементс
источник
11
Зачем вам нужна эта запятая
SIslam
32
@Sslam Без запятой, она будет интерпретироваться как скобки, обычно используемые для обхода порядка старшинства:(a+b)*c
Джозеф Янг
2
да, но вы можете сделать new = a + bвместо new = a + (b,). AFAICT, работает одинаково в python3 и python2.7.
ILMostro_7
5
@ ILMostro_7 зависит от того, что б, хотя
Джон Клементс
Или a += ('z',)
вкратце
54

Начиная с Python 3.5 ( PEP 448 ) вы можете распаковывать в кортеже, наборе списков и dict:

a = ('2',)
b = 'z'
new = (*a, b)
бесконечно
источник
33

От кортежа к списку кортежу:

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

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

tuple(l)

Или с более длинным списком предметов для добавления

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

l = list(a)

for x in items:
    l.append(x)

print tuple(l)

дает тебе

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

Суть здесь в следующем: List - это изменяемый тип последовательности. Таким образом, вы можете изменить данный список, добавляя или удаляя элементы. Tuple - это тип неизменяемой последовательности. Вы не можете изменить кортеж. Таким образом, вы должны создать новый .

kiriloff
источник
5
Это будет вдвое медленнее, чем просто добавление двух кортежей
jamylak
2
Однако, если вы отметите OP для преобразования listв начало, добавьте элементы, а затем в самом конце выполните преобразование в, tupleтогда это лучшее решение +1
jamylak
два элемента, включая первый список итемина. но вы правы, мне лучше добавить пример с более длинным списком, см. мое редактирование
kiriloff
13

Кортеж может разрешить только добавление tupleк нему. Лучший способ сделать это:

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

Я попробовал тот же сценарий с приведенными ниже данными, все это, кажется, работает нормально.

>>> mytuple = (u'2',)
>>> mytuple += ('example text',)
>>> print mytuple
(u'2','example text')
user3798348
источник
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
источник
2

Форма № 1

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

№ 2 форма

a = ('x', 'y')
b = a + tuple('b')
print(b)
britodfbr
источник
Второй вариант не работает. TypeError: 'int' object is not iterable
Оби Ван - PallavJha
1

В итоге, самый простой способ добавить к кортежу - заключить добавляемый элемент в круглые скобки и запятую.

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

out: ('a', 4, 'string', 5.0)
alphahmed
источник