Convertir lista a tupla en Python

544

Estoy tratando de convertir una lista en una tupla.

La mayoría de las soluciones en Google ofrecen el siguiente código:

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

Sin embargo, el código produce un mensaje de error cuando lo ejecuto:

TypeError: el objeto 'tupla' no es invocable ¿Cómo puedo solucionar este problema?

LynnH
fuente
78
¿Asignó el nombre de la variable en tupleotro lugar antes?
eumiro
18
No debe ser demasiado exigente, pero probablemente tampoco debería usar minúsculas "el" como nombre de variable debido a su parecido a 1. Lo mismo ocurre con "oh" mayúscula debido a su parecido a cero. Incluso "li" es mucho más legible en comparación.
Albert Rothman

Respuestas:

815

Debería funcionar bien. No utilice tuple, listu otros nombres especiales como un nombre de variable. Probablemente sea lo que está causando tu problema.

>>> l = [4,5,6]
>>> tuple(l)
(4, 5, 6)
raíz
fuente
109

Ampliando el comentario de eumiro, normalmente tuple(l)convertirá una lista len una tupla:

In [1]: l = [4,5,6]

In [2]: tuple
Out[2]: <type 'tuple'>

In [3]: tuple(l)
Out[3]: (4, 5, 6)

Sin embargo, si has redefinido tuplepara ser una tupla en lugar de la type tuple:

In [4]: tuple = tuple(l)

In [5]: tuple
Out[5]: (4, 5, 6)

entonces obtienes un TypeError ya que la tupla en sí no es invocable:

In [6]: tuple(l)
TypeError: 'tuple' object is not callable

Puede recuperar la definición original tupleal salir y reiniciar su intérprete o (gracias a @glglgl):

In [6]: del tuple

In [7]: tuple
Out[7]: <type 'tuple'>
unutbu
fuente
29

Es posible que hayas hecho algo como esto:

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

Aquí está el problema ... Ya que ha utilizado una tuplevariable para contener un tuple (45, 34)anterior ... Entonces, ahora tuplees objectde tipo tupleahora ...

Ya no es typeay, por lo tanto, ya no existe Callable.

Neveruse cualquier tipo incorporado como su nombre de variable ... Usted tiene cualquier otro nombre para usar. Use cualquier nombre arbitrario para su variable en su lugar ...

Rohit Jain
fuente
25

Para agregar otra alternativa tuple(l), a partir de Python> = 3.5puede hacer:

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

breve, un poco más rápido pero probablemente adolece de legibilidad.

Esto esencialmente desempaqueta la lista ldentro de un literal de tupla que se crea debido a la presencia de una coma individual ,.


Ps: El error que está recibiendo se debe al enmascaramiento del nombre, tuplees decir, que asignó la tupla de nombre en algún lugar, por ejemplo tuple = (1, 2, 3).

Usarlo del tupledebería ser bueno para ir.

Dimitris Fasarakis Hilliard
fuente
4

Encuentro muchas respuestas actualizadas y respondidas correctamente, pero agregaré algo nuevo a la pila de respuestas.

En Python hay infinitas formas de hacer esto, aquí hay algunos casos de
manera normal

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

forma inteligente

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

Recuerde que la tupla es inmutable, se usa para almacenar algo valioso. Por ejemplo, la contraseña, clave o hash se almacenan en tuplas o diccionarios. Si se necesita un cuchillo, ¿por qué usar la espada para cortar manzanas? Úselo sabiamente, también hará que su programa sea eficiente.

El exorcista
fuente
2
¿Cuál es la ventaja de la segunda vía?
Granny Aching
@GrannyAching en esta definición del mundo moderno de inteligente sigue cambiando, ya que es un enfoque perezoso hecho en una línea, supongo que es una forma inteligente.
TheExorcist
1
tuple(l)(primera forma) es más corta que tuple(item for item in l)(segunda forma).
Abuela Dolor