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?


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)

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

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


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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.