7

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

1

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

Большинство решений, предлагаемых в Google, выглядят следующим образом:

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

Однако, когда я запускаю этот код, возникает сообщение об ошибке:

TypeError: 'tuple' object is not callable

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

5 ответ(ов)

10

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

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

>>> tuple = 'whoops'   # Не делайте этого
>>> tuple(l)
TypeError: 'tuple' object is not callable
1

Расширяя комментарий 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'>
0

Чтобы добавить ещё один альтернативный способ создания кортежа из списка l, начиная с Python >= 3.5, вы можете сделать так:

t = *l,  # или t = (*l,)

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

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


P.S. Ошибка, которую вы получаете, вызвана тем, что имя tuple было затенено, то есть вы присвоили значение переменной с именем tuple где-то, например, tuple = (1, 2, 3).

Используя del tuple, вы сможете вернуть всё в норму.

0

Проблема, с которой вы столкнулись, заключается в том, что вы использовали имя 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, в качестве имен ваших переменных. Вместо этого выберите любое другое имя для вашей переменной, чтобы избежать конфликтов.

0

В 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) является неизменяемым типом данных и обычно используется для хранения чего-то ценного, например, паролей, ключей или хешей. Если вам нужен нож, зачем использовать меч, чтобы резать яблоки? Используйте соответствующие инструменты для задачи — это сделает ваш код более эффективным.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь