Come creare una tupla con un solo elemento


107

Nell'esempio seguente mi aspetto che tutti gli elementi siano tuple, perché una tupla viene convertita in una stringa quando contiene solo una singola stringa?

>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>

1
('a')valuta solo'a'
oldrinb

1
Wow - 3 risposte corrette in 3 minuti :) Tuttavia, nota il segreto di ,:a = 1, 2, 3; print a

26
Le parentesi non formano una tupla, le virgole sì.
cdarke

17
@cdarke, ad eccezione della tupla vuota (), che consiste solo in una coppia di parentesi.
Frédéric Hamidi

2
Vero, o meglio, False- praticamente tutto ciò per cui una tupla vuota è utile (se capisci cosa intendo).
cdarke

Risposte:


140

Perché quei primi due elementi non sono tuple; sono solo stringhe. Le parentesi non le rendono automaticamente tuple. Devi aggiungere una virgola dopo la stringa per indicare a Python che dovrebbe essere una tupla.

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

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

Per correggere il codice di esempio, aggiungi virgole qui:

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

             ^       ^

Dai documenti di Python :

Un problema speciale è la costruzione di tuple contenenti 0 o 1 elementi: la sintassi ha alcune stranezze extra per adattarle. Le tuple vuote sono costruite da una coppia di parentesi vuote; una tupla con un elemento viene costruita seguendo un valore con una virgola (non è sufficiente racchiudere un singolo valore tra parentesi). Brutto, ma efficace.

Se odi davvero la sintassi della virgola finale, una soluzione alternativa è passare lista alla tuple()funzione:

x = tuple(['a'])

7
Questo però non è molto elegante e sembra un po 'confuso. C'è un altro modo?
Robert Moore

3
Non sembra funzionare. Ad esempio: tupla ("abc") (con o senza virgola aggiuntiva) restituisce ('a', 'b', 'c'), mentre ("abc",) restituisce ('abc'). Quindi tuple () sembra non essere un'opzione praticabile qui.
Ben Farmer

3
@ Ben Dai un'occhiata ai documenti . tuple accetta un iterabile , che è una stringa (esegue l'iterazione sui caratteri). Se ti ostini a non utilizzare la virgola finale, poi fare una lista intermedia: tuple(['abc']).
Jonathon Reinhart

Certo, sto solo dicendo che la funzione tupla non nega la necessità della virgola.
Ben Farmer

1
@matanster La sintassi della lingua non è cambiata a questo proposito. AFAIK il problema è lo stesso per Python 2 e 3.
Jonathon Reinhart

20

I tuoi primi due esempi non sono tuple, sono stringhe. Le tuple di un singolo elemento richiedono una virgola finale, come in:

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

11

('a') non è una tupla, ma solo una stringa.

È necessario aggiungere una virgola in più alla fine per pythonprenderli come tuple: -

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>> 
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.