Cómo crear una tupla con un solo elemento

107

En el siguiente ejemplo, esperaría que todos los elementos fueran tuplas, ¿por qué una tupla se convierte en una cadena cuando solo contiene una sola cadena?

>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>
Russell
fuente
1
('a')solo evalúa a'a'
oldrinb
1
Wow - 3 respuestas correctas en 3 minutos :) Sin embargo, tenga en cuenta el secreto de ,:a = 1, 2, 3; print a
26
Los corchetes no forman una tupla, las comas sí.
cdarke
17
@cdarke, excepto la tupla vacía (), que solo consta de un par de paréntesis.
Frédéric Hamidi
2
Es cierto, o más bien, Falsepara casi todo lo que sirve una tupla vacía (si entiendes lo que quiero decir).
cdarke

Respuestas:

140

Porque esos dos primeros elementos no son tuplas; son solo cuerdas. El paréntesis no los convierte automáticamente en tuplas. Debe agregar una coma después de la cadena para indicar a Python que debe ser una tupla.

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

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

Para corregir su código de ejemplo, agregue comas aquí:

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

             ^       ^

Desde Python Docs :

Un problema especial es la construcción de tuplas que contienen 0 o 1 elementos: la sintaxis tiene algunas peculiaridades adicionales para acomodarlos. Las tuplas vacías se construyen con un par de paréntesis vacíos; una tupla con un elemento se construye siguiendo un valor con una coma (no es suficiente incluir un solo valor entre paréntesis). Feo, pero efectivo.

Si realmente odias la sintaxis de la coma final, una solución es pasar un lista la tuple()función:

x = tuple(['a'])
Jonathon Reinhart
fuente
6
Sin embargo, esto no es muy elegante y parece un poco confuso. ¿Hay alguna otra manera?
Robert Moore
3
Eso no parece funcionar. Por ejemplo: tupla ("abc") (con o sin coma adicional) da ('a', 'b', 'c'), mientras que ("abc",) da ('abc'). Entonces, tuple () parece no ser una opción viable aquí.
Ben Farmer
3
@Ben Echa un vistazo a los documentos . tuple acepta un iterable , que es una cadena (itera sobre caracteres). Si insiste en no usar la coma final, a continuación, hacer una lista intermedia: tuple(['abc']).
Jonathon Reinhart
Claro, solo estoy diciendo que la función tupla no niega la necesidad de la coma.
Ben Farmer
1
@matanster La sintaxis del idioma no ha cambiado en este sentido. AFAIK, el problema es el mismo para Python 2 y 3.
Jonathon Reinhart
20

Tus dos primeros ejemplos no son tuplas, son cadenas. Las tuplas de un solo elemento requieren una coma al final, como en:

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

('a') no es una tupla, sino solo una cadena.

Debe agregar una coma adicional al final para que se pythontomen como tuple: -

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