Comment créer un tuple avec un seul élément

107

Dans l'exemple ci-dessous, je m'attendrais à ce que tous les éléments soient des tuples, pourquoi un tuple est-il converti en chaîne alors qu'il ne contient qu'une seule chaîne?

>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>
Russell
la source
1
('a')évalue juste à'a'
oldrinb
1
Wow - 3 bonnes réponses en 3 minutes :) Cependant, notez le secret de ,:a = 1, 2, 3; print a
26
Les crochets ne font pas de tuple, les virgules le font.
cdarke
17
@cdarke, sauf pour le tuple vide (), qui consiste uniquement en une paire de parenthèses.
Frédéric Hamidi
2
Vrai, ou plutôt, False- à peu près tous un tuple vide est bon (si vous voyez ce que je veux dire).
cdarke

Réponses:

140

Parce que ces deux premiers éléments ne sont pas des tuples; ce ne sont que des chaînes. Les parenthèses ne font pas automatiquement d'eux des tuples. Vous devez ajouter une virgule après la chaîne pour indiquer à python qu'il doit s'agir d'un tuple.

>>> type( ('a') )
<type 'str'>

>>> type( ('a',) )
<type 'tuple'>

Pour corriger votre exemple de code, ajoutez des virgules ici:

>>> a = [('a',), ('b',), ('c', 'd')]

             ^       ^

À partir de la documentation Python :

Un problème particulier est la construction de tuples contenant 0 ou 1 éléments: la syntaxe a quelques bizarreries supplémentaires pour les accueillir. Les tuples vides sont construits par une paire de parenthèses vides; un tuple avec un élément est construit en suivant une valeur avec une virgule (il ne suffit pas de mettre une seule valeur entre parenthèses). Moche, mais efficace.

Si vous détestez vraiment la syntaxe de la virgule de fin, une solution de contournement consiste à passer un listà la tuple()fonction:

x = tuple(['a'])
Jonathon Reinhart
la source
7
Ce n'est pas très élégant et semble un peu déroutant. Est-ce qu'il y a un autre moyen?
Robert Moore
3
Cela ne semble pas fonctionner. Par exemple: tuple ("abc") (avec ou sans virgule supplémentaire) donne ('a', 'b', 'c'), tandis que ("abc",) donne ('abc'). Donc, tuple () ne semble pas être une option viable ici.
Ben Farmer
3
@Ben Jetez un œil à la documentation . tuple accepte un itérable , qui est une chaîne (itère sur des caractères). Si vous insistez pour ne pas utiliser la virgule de fin, puis faire une liste intermédiaire: tuple(['abc']).
Jonathon Reinhart
Bien sûr, je dis simplement que la fonction tuple ne supprime pas le besoin de la virgule.
Ben Farmer
1
@matanster La syntaxe du langage n'a pas changé à cet égard. AFAIK le problème est le même pour Python 2 et 3.
Jonathon Reinhart
20

Vos deux premiers exemples ne sont pas des tuples, ce sont des chaînes. Les tuples à un seul élément nécessitent une virgule de fin, comme dans:

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
Frédéric Hamidi
la source
11

('a') n'est pas un tuple, mais juste une chaîne.

Vous devez ajouter une virgule supplémentaire à la fin pour les faire pythonprendre comme tuple: -

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>> 
Rohit Jain
la source