Como criar uma tupla com apenas um elemento

107

No exemplo a seguir, eu esperaria que todos os elementos fossem tuplas, por que uma tupla é convertida em uma string quando ela contém apenas uma única string?

>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>
Russell
fonte
1
('a')apenas avalia para'a'
oldrinb
1
Uau - 3 respostas corretas em 3 minutos :) No entanto, observe o segredo de ,:a = 1, 2, 3; print a
26
Os colchetes não formam uma tupla, as vírgulas, sim.
cdarke
17
@cdarke, exceto para a tupla vazia (), que consiste apenas em um par de parênteses.
Frédéric Hamidi
2
Verdade, ou melhor, False- quase tudo para que uma tupla vazia é boa (se é que você me entende).
cdarke

Respostas:

140

Porque esses dois primeiros elementos não são tuplas; eles são apenas strings. Os parênteses não os tornam tuplas automaticamente. Você deve adicionar uma vírgula após a string para indicar ao python que deve ser uma tupla.

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

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

Para corrigir seu código de exemplo, adicione vírgulas aqui:

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

             ^       ^

Dos documentos do Python :

Um problema especial é a construção de tuplas contendo 0 ou 1 item: a sintaxe tem algumas peculiaridades extras para acomodá-las. As tuplas vazias são construídas por um par vazio de parênteses; uma tupla com um item é construída seguindo um valor com uma vírgula (não é suficiente colocar um único valor entre parênteses). Feio, mas eficaz.

Se você realmente odeia a sintaxe da vírgula final, uma solução alternativa é passar um listpara a tuple()função:

x = tuple(['a'])
Jonathon Reinhart
fonte
6
Isso não é muito elegante e parece meio confuso. Existe alguma outra maneira?
Robert Moore
3
Isso não parece funcionar. Por exemplo: tupla ("abc") (com ou sem vírgula extra) dá ('a', 'b', 'c'), enquanto ("abc",) dá ('abc'). Portanto, tupla () parece não ser uma opção viável aqui.
Ben Farmer
3
@Ben Dê uma olhada na documentação . tuple aceita um iterável , que é uma string (itera sobre os caracteres). Se você insistir em não usar a vírgula à direita, em seguida, fazer uma lista intermediária: tuple(['abc']).
Jonathon Reinhart
Claro, estou apenas dizendo que a função tupla não nega a necessidade da vírgula.
Ben Farmer
1
@matanster A sintaxe da linguagem não mudou a este respeito. AFAIK o problema é o mesmo para Python 2 e 3.
Jonathon Reinhart
20

Seus primeiros dois exemplos não são tuplas, são strings. As tuplas de item único exigem uma vírgula final, como em:

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

('a') não é uma tupla, mas apenas uma string.

Você precisa adicionar uma vírgula extra no final para pythontomá-los como tuple: -

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