Вопрос по python – Конкатенирующий кортеж

23

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

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

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

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

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

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

что плохого в кортеже (а)? joaquin
Если вы хотите отредактировать его, кортеж не ваш ответ, просто используйте список. Точный смысл кортежа - быть неизменным списком. Josiah
ничего плохого ... я хотел иметь больший контроль над списком, чтобы я мог динамически добавлять данные, когда захочу ... использование tuple (a) даст (1,2,3,4,5), что если я захочу добавить 6,7,8,9,0 в тот же список ... я хотел обобщенное решение user784530

Ваш Ответ

7   ответов
11
state=()  
for i in a:  
    state=state+(i,)

когда новыйtuple (i,) в состояние кортежа.

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

0

я думаю, что я нашел наиболее общее решение этой проблемы:

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)

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

1

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

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

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

54

Tuples are immutable, you cannot append, delete, or edit them at all. If you want to turn a list into a tuple, you can just use the tuple function:

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

tuple(list(a)+b)

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

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

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

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

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

@thepaul(1, 2) + (3,) сделал трюк!
& quot; Вы никогда не должны этого делать & quot; не может быть полезным советом, так как выcan't добавить к кортежу :), но часто полезно генерироватьnew кортеж тот же, что и старый, с добавлением большего количества элементов. Кроме того, нет необходимости поворачиватьa вlist в вашем втором примере; это должно быть простоa + tuple(b) или жеa + (b,) если b это элемент, который нужно добавить вместо итерируемого.
@thepaul Спасибо за этот синтаксис. я думалb, + a будет работать, но это не так - вот почему я оказался на этой странице. В этом сценарии необходимы скобки, так как они у вас есть:(b,) + a, Однако пытаясь сделатьtuple(b) когда b является целым числом, выдает ошибку'int' object is not iterable, Я использую Python 2.7.8.
@ user666412 Спасибо, исправлено.
state=+=(i,) - У меня "неверный синтаксис" ошибка и пришлось заменить наstate+=(i,).
1

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

a = [1,2,3,4,5]
tuple(a) 
Но вы можете объединить два кортежа и переназначить результат переменной, содержащей кортеж, так что вы все равно можете постепенно создавать кортеж, как в ответах Байрона или Джосии. Вопрос заключается в том, является ли это эффективным способом сделать это, поскольку интерпретатор, вероятно, будет выделять новую память для каждого создаваемого вами кортежа, чего он не будет делать, если вы оперируете списком.
5
>>> a = [1,2,3,4,5]
>>> tuple(a)
(1, 2, 3, 4, 5)
ФП прямо написал, что это не вариант для него.
хорошо .. это как наборы ... используя петли user784530
2

(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 действительно очень гибкий

Похожие вопросы