Преобразование списка в кортеж в 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