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',)
вкратце


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 - это тип неизменяемой последовательности. Вы не можете изменить кортеж. Таким образом, вы должны создать новый .


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

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

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

№ 2 форма

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

Второй вариант не работает. TypeError: 'int' object is not iterable
Оби Ван - PallavJha

1

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

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

out: ('a', 4, 'string', 5.0)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.