Конкатенация кортежа - программирование
Подтвердить что ты не робот

Конкатенация кортежа

Предположим, у меня есть список:

a=[1,2,3,4,5]  

Теперь я хочу преобразовать этот список в кортеж. Я думал, что такое кодирование будет выглядеть так:

state=()  
for i in a:  
    state=state+i

и это дало ошибку. Это совершенно очевидно, почему я пытаюсь объединить целое число с кортежем.

Но кортежи не выполняют те же функции, что и в списках, например вставку или добавление. Итак, как я могу добавлять элементы через цикл? То же самое со словарями, я чувствую, что у меня отсутствует ссылка.

4b9b3361

Ответ 1

Кортежи неизменяемы, вы не можете добавлять, удалять или редактировать их вообще. Если вы хотите превратить список в кортеж, вы можете просто использовать функцию набора:

tuple(a)

Если по какой-то причине вы чувствуете необходимость добавления к кортежу (вы никогда не должны этого делать), вы всегда можете вернуть его обратно в список, добавить, а затем перевернуть обратно в кортеж:

tuple(list(a)+b)

Продолжайте получать голоса за это, а это значит, что люди продолжают его видеть, поэтому время для обновления и удаления дезинформации.

ОК, чтобы добавить элементы в кортеж (вроде). Это было глупо сказать. Кортежи по-прежнему неизменяемы, вы не можете редактировать их, но вы можете создавать новые, которые выглядят так, как вы добавляете, добавляя несколько кортежей вместе. tuple(list(a)+b) глупо, не делайте этого. Просто сделайте tuple1 + tuple2, потому что Python не сосать. Для предоставленного кода вам нужно:

state = ()  
for i in a:  
    state += (i,)

Ответ Павла на этот ответ более прав, чем когда-либо был этот ответ.

Теперь я могу перестать чувствовать себя плохо.

Ответ 2

state=()  
for i in a:  
    state=state+(i,)

Вышеприведенный код будет работать, чтобы объединить каждый раз новое tuple (i,) в состояние tuple.

Я использую python 2.7.9.

Ответ 3

>>> a = [1,2,3,4,5]
>>> tuple(a)
(1, 2, 3, 4, 5)

Ответ 4

просто своего рода precis: (2,) на самом деле тот же tuple([2]), чтобы вы могли написать:

>>>(2,) + tuple([2,3])
(2, 2, 3)
>>> tuple([2]) + (2,3)
(2, 2, 3)
>>> tuple([2]) + tuple([2,3])
(2, 2, 3)

python очень гибкий

Ответ 5

tuple не изменен в python.

поэтому после того, как вы запустили его с помощью кортежа (...), его нельзя изменить.

a = [1,2,3,4,5]
tuple(a) 

Ответ 6

Если вы хотите получить обобщенное решение, просто создайте новый список и затем преобразуйте его в кортеж после завершения.

Вы можете постепенно наращивать свой кортеж, используя решение, предоставленное в ответах Josia и byron, но это создаст новый кортеж для каждой итерации, что очень неэффективно, если список, который вы хотите преобразовать, большой, потому что интерпретатор будет необходимо скопировать все элементы из старого кортежа в новый кортеж на каждой итерации, для чего требуются операции O (n ^ 2).

Это не происходит со списками, поскольку python фактически выделяет больше памяти, чем требуется, чтобы просто хранить элементы списка, на всякий случай, если вы добавите. Ну, по крайней мере, это не обязательно, пока эта память не закончится, и python должен выделить больше памяти. Затем он выделит большой кусок памяти и переместит все элементы в новое место, но снова эта новая часть памяти будет больше, чем требуется, чтобы просто сохранить элементы списка. Таким образом, создание списка просто требует O (n) операций и поэтому предпочитает.

Ответ 7

После возникновения аналогичных проблем с построением C/NN с гибкими тензорными формами, я думаю, что я построил наиболее общее решение этой проблемы:

def cat(*args):
  x = ()
  for a in args:
    if type(a) is tuple:
      x+=a
    elif type(a) in {list,numpy.ndarray}:
      x+=tuple(a)
    else:
      x+=(a,)
  return tuple(x)

Демо:

In [0]: cat(1,(1,2),(3,4),[1,2],2)
Out[0]: (1, 1, 2, 3, 4, 1, 2)

Не уверен, что это плохой питон, я новичок:)