So erstellen Sie ein Tupel mit nur einem Element

104

Im folgenden Beispiel würde ich erwarten, dass alle Elemente Tupel sind. Warum wird ein Tupel in eine Zeichenfolge konvertiert, wenn es nur eine einzelne Zeichenfolge enthält?

>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>
Russell
quelle
1
('a')bewertet gerade zu'a'
oldrinb
1
Wow - 3 richtige Antworten in 3 Minuten :) Beachten Sie jedoch das Geheimnis von ,:a = 1, 2, 3; print a
25
Klammern machen kein Tupel, Kommas schon.
Cdarke
16
@cdarke, mit Ausnahme des leeren Tupels (), das nur aus zwei Klammern besteht.
Frédéric Hamidi
2
Richtig oder besser gesagt False- fast alles, wofür ein leeres Tupel gut ist (wenn Sie sehen, was ich meine).
Cdarke

Antworten:

138

Weil diese ersten beiden Elemente keine Tupel sind; Sie sind nur Saiten. Die Klammern machen sie nicht automatisch zu Tupeln. Sie müssen nach der Zeichenfolge ein Komma einfügen, um Python anzuzeigen, dass es sich um ein Tupel handeln soll.

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

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

Fügen Sie hier Kommas hinzu, um Ihren Beispielcode zu korrigieren:

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

             ^       ^

Aus den Python-Dokumenten :

Ein besonderes Problem ist die Konstruktion von Tupeln, die 0 oder 1 Elemente enthalten: Die Syntax weist einige zusätzliche Macken auf, um diese zu berücksichtigen. Leere Tupel werden durch ein leeres Klammerpaar konstruiert. Ein Tupel mit einem Element wird erstellt, indem einem Wert ein Komma folgt (es reicht nicht aus, einen einzelnen Wert in Klammern zu setzen). Hässlich, aber effektiv.

Wenn Sie die nachfolgende Kommasyntax wirklich hassen, besteht eine Problemumgehung darin, a listan die tuple()Funktion zu übergeben:

x = tuple(['a'])
Jonathon Reinhart
quelle
6
Dies ist jedoch nicht sehr elegant und sieht irgendwie verwirrend aus. Gibt es einen anderen Weg?
Robert Moore
3
Das scheint nicht zu funktionieren. Zum Beispiel: Tupel ("abc") (mit oder ohne zusätzliches Komma) ergibt ('a', 'b', 'c'), während ("abc",) ('abc') ergibt. Tuple () scheint hier also keine praktikable Option zu sein.
Ben Farmer
3
@ Ben Schauen Sie sich die Dokumente an . tuple akzeptiert eine iterable , die eine Zeichenfolge ist (iteriert über Zeichen). Wenn Sie darauf bestehen, das nachfolgende Komma nicht zu verwenden, erstellen Sie eine Zwischenliste : tuple(['abc']).
Jonathon Reinhart
Klar, ich sage nur, dass die Tupelfunktion die Notwendigkeit des Kommas nicht negiert.
Ben Farmer
1
@matanster Die Sprachsyntax hat sich diesbezüglich nicht geändert. AFAIK das Problem ist das gleiche für Python 2 und 3.
Jonathon Reinhart
20

Ihre ersten beiden Beispiele sind keine Tupel, sondern Zeichenfolgen. Einzelelement-Tupel erfordern ein nachfolgendes Komma, wie in:

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

('a') ist kein Tupel, sondern nur eine Zeichenfolge.

Sie müssen am Ende ein zusätzliches Komma hinzufügen, damit pythonsie wie folgt angezeigt werden tuple: -

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