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


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

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

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

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

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

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

6 414

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 быть кортежем, а не typetuple:

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 сейчас...

это больше не a type а значит, его больше нет Callable.

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

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

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

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

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


P. s: ошибка, которую вы получаете, связана с маскировкой имени tuple т. е. вы назначили имя кортеж где-то например 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