Перетворити список для кортежу в 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.