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
@SIslam Без коми, це буде просто інтерпретовано як дужки, які зазвичай використовуються для обходу порядку пріоритетності:(a+b)*c
Джозеф Янг

2
так, але можна зробити new = a + bзамість цього new = a + (b,). AFAICT, працює однаково в python3 та python2.7.
ILMostro_7

5
@ ILMostro_7 залежить від того, що це b
Джон Клементс

Або коротко a += ('z',), як згадується у
нижченаведеній

54

З Python 3.5 ( PEP 448 ) ви можете розпаковувати в межах кордону, набору списків і диктату:

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

Суть у цьому: Список - це тип, що змінюється послідовно. Таким чином, ви можете змінити заданий список, додавши або видаливши елементи. Кортеж - це непорушний тип послідовностей. Ви не можете змінити кортеж. Тож вам доведеться створити нову .


5
Це буде вдвічі повільніше, ніж лише додавання двох кортежів
jamylak

2
Однак якщо ви зауважили, що для перетворення 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
Obi Wan - 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.