Convertir la liste en tuple en Python

544

J'essaie de convertir une liste en tuple.

La plupart des solutions sur Google proposent le code suivant:

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

Cependant, le code génère un message d'erreur lorsque je l'exécute:

TypeError: l'objet 'tuple' n'est pas appelable Comment puis-je résoudre ce problème?

LynnH
la source
78
Avez-vous déjà attribué le nom de variable tupleailleurs?
eumiro
18
Pour ne pas être trop pointilleux, mais vous ne devriez probablement pas non plus utiliser les minuscules "el" comme nom de variable en raison de sa ressemblance avec 1. Il en va de même pour le "oh" majuscule en raison de sa ressemblance avec zéro. Même "li" est beaucoup plus lisible en comparaison.
Albert Rothman

Réponses:

815

Cela devrait bien fonctionner. Ne pas utiliser tuple, listou d' autres noms spéciaux comme nom de variable. C'est probablement ce qui cause votre problème.

>>> l = [4,5,6]
>>> tuple(l)
(4, 5, 6)
racine
la source
109

En développant le commentaire d'eumiro, tuple(l)cela convertira normalement une liste len tuple:

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

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

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

Cependant, si vous avez redéfini tuplepour être un tuple plutôt que le type tuple:

In [4]: tuple = tuple(l)

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

alors vous obtenez une TypeError puisque le tuple lui-même n'est pas appelable:

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

Vous pouvez récupérer la définition d'origine de tupleen quittant et en redémarrant votre interprète, ou (grâce à @glglgl):

In [6]: del tuple

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

Vous pourriez avoir fait quelque chose comme ça:

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

Voici le problème ... Puisque vous avez utilisé une tuplevariable pour contenir une tuple (45, 34)précédente ... Donc, maintenant tuplec'est un objecttype tuplemaintenant ...

Ce n'est plus un typeet donc, ce n'est plus Callable.

Neverutilisez n'importe quel type intégré comme nom de variable ... Vous avez un autre nom à utiliser. Utilisez un nom arbitraire pour votre variable à la place ...

Rohit Jain
la source
25

Pour ajouter une autre alternative à tuple(l), à partir de Python> = 3.5vous pouvez faire:

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

bref, un peu plus rapide mais souffre probablement de lisibilité.

Cela décompresse essentiellement la liste ldans un littéral de tuple qui est créé en raison de la présence de la virgule unique ,.


Ps: L'erreur que vous recevez est due au masquage du nom, tuplec'est-à-dire que vous avez attribué au tuple de nom quelque part, par exemple tuple = (1, 2, 3).

Utiliser del tupledevrait être bon pour vous.

Dimitris Fasarakis Hilliard
la source
4

Je trouve de nombreuses réponses à jour et correctement répondues, mais j'ajouterai quelque chose de nouveau à la pile de réponses.

En python, il existe des façons infinies de le faire, voici quelques exemples de
manière normale

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

façon intelligente

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

N'oubliez pas que le tuple est immuable, utilisé pour stocker quelque chose de précieux. Par exemple, le mot de passe, la clé ou les hachages sont stockés dans des tuples ou des dictionnaires. Si un couteau est nécessaire, pourquoi utiliser l'épée pour couper les pommes. Utilisez-le judicieusement, cela rendra également votre programme efficace.

L'Exorciste
la source
2
Quel est l'avantage de la deuxième voie?
Granny Aching
@GrannyAching dans cette définition du monde moderne de smart ne cesse de changer, car c'est une approche paresseuse faite en une seule ligne, je suppose que c'est une manière intelligente.
TheExorcist
1
tuple(l)(première voie) est plus courte que tuple(item for item in l)(deuxième voie).
Granny Aching