Converti l'elenco in tupla in Python


544

Sto cercando di convertire un elenco in una tupla.

La maggior parte delle soluzioni su Google offre il seguente codice:

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

Tuttavia, il codice genera un messaggio di errore quando lo eseguo:

TypeError: l'oggetto 'tuple' non è richiamabile Come posso risolvere questo problema?


78
Hai assegnato il nome della variabile tuplealtrove prima?
eumiro,

18
Non essere troppo esigente, ma probabilmente non dovresti usare "el" minuscolo come nome variabile a causa della sua somiglianza con 1. Lo stesso vale per il capitale "oh" a causa della sua somiglianza con zero. Anche "li" è molto più leggibile in confronto.
Albert Rothman,

Risposte:


815

Dovrebbe funzionare bene. Non utilizzare tuple, listo altri nomi speciali come un nome di variabile. Probabilmente è ciò che sta causando il tuo problema.

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

109

Espandendo il commento di eumiro, normalmente tuple(l)si converte un elenco lin una tupla:

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

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

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

Tuttavia, se hai ridefinito tupleper essere una tupla anziché il type tuple:

In [4]: tuple = tuple(l)

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

quindi si ottiene un TypeError poiché la tupla stessa non è richiamabile:

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

Puoi recuperare la definizione originale per tupleuscendo e riavviando il tuo interprete, oppure (grazie a @glglgl):

In [6]: del tuple

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

29

Potresti aver fatto qualcosa del genere:

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

Ecco il problema ... Dato che hai usato una tuplevariabile per contenere un tuple (45, 34)precedente ... Quindi, ora tupleè un objecttipo tupleora ...

Non è più un typee quindi non è più Callable.

Neverusa qualsiasi tipo incorporato come nome della tua variabile ... Hai un altro nome da usare. Usa invece qualsiasi nome arbitrario per la tua variabile ...


25

Per aggiungere un'altra alternativa a tuple(l), a partire da Python> = 3.5puoi fare:

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

Insomma, un po ' più veloce ma probabilmente soffre di leggibilità.

Questo essenzialmente decomprime l'elenco lall'interno di una tupla letterale creata a causa della presenza della singola virgola ,.


Ps: L'errore che stai ricevendo è dovuto al mascheramento del nome, tupleovvero hai assegnato al nome tupla da qualche parte, ad es tuple = (1, 2, 3).

Usare del tuplete dovrebbe essere buono per andare.


4

Trovo molte risposte aggiornate e risposte adeguate, ma aggiungerò qualcosa di nuovo alla pila di risposte.

In Python ci sono infiniti modi per farlo, ecco alcuni casi in
modo normale

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

modo intelligente

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

Ricorda che la tupla è immutabile, usata per conservare qualcosa di prezioso. Ad esempio password, chiave o hash sono memorizzati in tuple o dizionari. Se è necessario il coltello, perché usare la spada per tagliare le mele. Usalo con saggezza, renderà anche efficiente il tuo programma.


2
Qual è il vantaggio del secondo modo?
Nonna dolorante,

@GrannyAching in questa moderna definizione mondiale di smart continua a cambiare, dal momento che è un approccio pigro fatto in una riga, immagino sia un modo intelligente.
esorcista il

1
tuple(l)(prima via) è più breve di tuple(item for item in l)(seconda via).
Nonna dolorante,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.