Перетворити список для кортежу в Python


544

Я намагаюся перетворити список в кортеж.

Більшість рішень в Google пропонують такий код:

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

Однак при появі коду з'являється повідомлення про помилку:

TypeError: об'єкт 'tuple' не можна викликати Як я можу виправити цю проблему?


78
Ви призначили ім'я змінної tupleраніше десь раніше?
eumiro

18
Не бути надто вибагливим, але ви, ймовірно, також не повинні використовувати малі регістри "el" як ім'я змінної через свою схожість на 1. Те ​​саме стосується і капіталу "о" через його схожість на нуль. Навіть "li" набагато легше читати порівняно.
Альберт Ротман

Відповіді:


815

Це має добре працювати. Чи не слід використовувати tuple, listабо інші спеціальні імена , як ім'я змінної. Напевно, це і є причиною вашої проблеми.

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

109

Розширюючись на коментар 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як кортеж, а не 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'>

29

Можливо, ви зробили щось подібне:

>>> 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використовувати будь-які вбудовані типи як своє ім'я змінної ... У вас є будь-яке інше ім’я для використання. Використовуйте замість будь-якого довільного імені для змінної ...


25

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

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

коротше, трохи швидше, але, ймовірно, страждає від читабельності.

Це, по суті, розпаковує список lусередині кортежу, який створюється завдяки наявності єдиної коми ,.


Ps: Помилка, яку ви отримуєте, пов’язана з маскуванням імені, tupleтобто ви присвоєні імені кортежу, наприклад, десь tuple = (1, 2, 3).

Використовуючи del tupleвас, слід добре йти.


4

Я знаходжу багато сучасних відповідей і відповіді належним чином, але додасть щось нове до групи відповідей.

У python існують нескінченні способи зробити це, ось кілька випадків
Normal way

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

розумний спосіб

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

Пам'ятайте, кортеж незмінний, використовується для зберігання чогось цінного. Наприклад, пароль, ключ або хеші зберігаються в кортежах або словниках. Якщо потрібен ніж, навіщо застосовувати меч для різання яблук. Використовуйте його з розумом, це також зробить вашу програму ефективною.


2
У чому перевага другого способу?
Бабуся

@GrannyAching у цьому сучасному світі визначення розумного постійно змінюється, оскільки це лінивий підхід, виконаний в один рядок, я думаю, це розумний спосіб.
TheExorcist

1
tuple(l)(перший спосіб) коротший, ніж tuple(item for item in l)(другий спосіб).
Бабуся
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.