Преобразование списка в кортеж в Python

Я пытаюсь преобразовать список в кортеж.

когда я google, я нахожу много ответов, похожих на:

l = [4,5,6]
tuple(l)

но если я это сделаю, я получу это сообщение об ошибке:

TypeError: объект 'tuple' не вызывается

Как я могу решить эту проблему?

6 ответов


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

>>> l = [4,5,6]
>>> tuple(l)
(4, 5, 6)

расширение комментария эумиро, обычно tuple(l) преобразует список l в кортеж:

In [1]: l = [4,5,6]

In [2]: tuple
Out[2]: <type 'tuple'>

In [3]: tuple(l)
Out[3]: (4, 5, 6)

однако, если вы переопределили значение tuple быть кортежем, а не type tuple:

In [4]: tuple = tuple(l)

In [5]: tuple
Out[5]: (4, 5, 6)

затем вы получаете TypeError, так как сам кортеж не вызывается:

In [6]: tuple(l)
TypeError: 'tuple' object is not callable

вы можете восстановить исходное определение tuple путем выхода и перезапуска интерпретатора или (благодаря @glglgl):

In [6]: del tuple

In [7]: tuple
Out[7]: <type 'tuple'>

вы могли бы сделать что-то вроде этого:

>>> tuple = 45, 34  # You used `tuple` as a variable here
>>> tuple
(45, 34)
>>> l = [4, 5, 6]
>>> tuple(l)   # Will try to invoke the variable `tuple` rather than tuple type.

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    tuple(l)
TypeError: 'tuple' object is not callable
>>>
>>> del tuple  # You can delete the object tuple created earlier to make it work
>>> tuple(l)
(4, 5, 6)

вот в чем проблема... Так как вы использовали tuple переменная для хранения tuple (45, 34) раньше... Итак, теперь tuple это object типа tuple сейчас...

не больше type и, следовательно, его больше нет Callable.

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


, чтобы добавить другую альтернативу tuple(l), начиная с Python >= 3.5 вы можете сделать:

t = *l,  # or t = (*l,) 

короткий, a немного быстрее, но, вероятно, страдает читабельность.

это, по сути, раскрывает список l внутри кортежа литерал, который создается из-за наличия одной запятой ,.


P. s: ошибка, которую вы получаете из-за маскировки имени tuple i.e вам присвоено имя кортеж где-то e.g tuple = (1, 2, 3).

используя del tuple вы должны быть хорошо идти.


Я нахожу много ответов на сегодняшний день и правильно ответил, но добавлю что-то новое в стек ответов.

в Python есть бесконечные способы сделать это, вот несколько примеров
Нормальный способ

>>> l= [1,2,"stackoverflow","pytho"]
>>> l
[1, 2, 'stackoverflow', 'pytho']
>>> tup = tuple(l)
>>> type(tup)
>>> tup = tuple(l)
>>> type(tup)
<type 'tuple'>
>>> type(tup)
<type 'tuple'>
>>> tup
(1, 2, 'stackoverflow', 'pytho')

умный способ

>>>tuple(item for item in l)
(1, 2, 'stackoverflow', 'pytho')

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


может кортеж распакованный > 3.5:

(*l)

работает, даже если tuple назначается где-то, например, в начале этого кода Вы пишете tuple=some_that_is_not_callable