Преобразование списка в кортеж в Python
Я пытаюсь преобразовать список в кортеж.
Большинство решений, предлагаемых в Google, выглядят следующим образом:
l = [4, 5, 6]
tuple(l)
Однако, когда я запускаю этот код, возникает сообщение об ошибке:
TypeError: 'tuple' object is not callable
Как я могу исправить эту проблему?
5 ответ(ов)
Это должно работать нормально. Не используйте tuple
, list
или другие специальные имена в качестве названий переменных. Возможно, это как раз и является причиной вашей проблемы.
>>> l = [4,5,6]
>>> tuple(l)
(4, 5, 6)
>>> tuple = 'whoops' # Не делайте этого
>>> tuple(l)
TypeError: 'tuple' object is not callable
Расширяя комментарий eumiro, обычно 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
как кортеж, а не как тип 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'>
Чтобы добавить ещё один альтернативный способ создания кортежа из списка l
, начиная с Python >= 3.5
, вы можете сделать так:
t = *l, # или t = (*l,)
Это чуть короче и немного быстрее, но, вероятно, страдает от читаемости.
Этот способ фактически распаковывает список l
внутри литерала кортежа, который создаётся из-за присутствия запятой ,
.
P.S. Ошибка, которую вы получаете, вызвана тем, что имя tuple
было затенено, то есть вы присвоили значение переменной с именем tuple где-то, например, tuple = (1, 2, 3)
.
Используя del tuple
, вы сможете вернуть всё в норму.
Проблема, с которой вы столкнулись, заключается в том, что вы использовали имя tuple
в качестве переменной, хранящей кортеж (например, tuple = 45, 34
). Теперь ваше имя переменной tuple
заменяет встроенный тип tuple
, и таким образом, когда вы пытаетесь вызвать tuple(l)
, Python считает, что вы пытаетесь вызвать объект, а не тип.
Вот подробности:
>>> tuple = 45, 34 # Вы использовали `tuple` как переменную
>>> tuple
(45, 34)
>>> l = [4, 5, 6]
>>> tuple(l) # Попробует вызвать переменную `tuple`, а не встроенный тип кортежа.
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
tuple(l)
TypeError: 'tuple' object is not callable
>>>
>>> del tuple # Вы можете удалить созданный ранее объект `tuple`, чтобы все заработало
>>> tuple(l)
(4, 5, 6)
Как вы видите, при попытке вызвать tuple(l)
происходит ошибка TypeError: 'tuple' object is not callable
, потому что tuple
теперь является объектом типа tuple
, а не встроенным типом.
Рекомендация: никогда не используйте имена встроенных типов, таких как tuple
, в качестве имен ваших переменных. Вместо этого выберите любое другое имя для вашей переменной, чтобы избежать конфликтов.
В Python существует множество способов преобразования списка в кортеж. Я хотел бы поделиться несколькими вариантами, которые, возможно, дополнят уже известные ответы.
Обычный способ:
>>> l = [1, 2, "stackoverflow", "python"]
>>> l
[1, 2, 'stackoverflow', 'python']
>>> tup = tuple(l)
>>> type(tup)
<class 'tuple'>
>>> tup
(1, 2, 'stackoverflow', 'python')
Умный способ:
>>> tuple(item for item in l)
(1, 2, 'stackoverflow', 'python')
Не забывайте, что кортеж (tuple) является неизменяемым типом данных и обычно используется для хранения чего-то ценного, например, паролей, ключей или хешей. Если вам нужен нож, зачем использовать меч, чтобы резать яблоки? Используйте соответствующие инструменты для задачи — это сделает ваш код более эффективным.
В чем разница между списками и кортежами?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Как изменить порядок столбцов в DataFrame?
Получение текущей даты в формате YYYY-MM-DD в Python
Как проверить тип NoneType в Python?