Конвертировать список в кортеж в Python


544

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

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

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

Тем не менее, код приводит к сообщению об ошибке при запуске:

Ошибка типа: объект '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сейчас ...

Это больше не a 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 есть бесконечные способы сделать это, вот несколько примеров
Нормальный способ

>>> 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.