Jak utworzyć krotkę z tylko jednym elementem

107

W poniższym przykładzie spodziewałbym się, że wszystkie elementy będą krotkami, dlaczego krotka jest konwertowana na ciąg, gdy zawiera tylko jeden ciąg?

>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>
Russell
źródło
1
('a')po prostu 'a'
szacuje się
1
Wow - 3 poprawne odpowiedzi w 3 minuty :) Zwróć jednak uwagę na sekret ,:a = 1, 2, 3; print a
26
Nawiasy nie tworzą krotki, przecinki tak.
cdarke
17
@cdarke, z wyjątkiem pustej krotki (), która składa się tylko z pary nawiasów.
Frédéric Hamidi
2
Prawda, a raczej False- prawie cała pusta krotka jest dobra (jeśli rozumiesz, o co mi chodzi).
cdarke

Odpowiedzi:

141

Ponieważ te dwa pierwsze elementy nie są krotkami; to tylko struny. Nawiasy nie tworzą automatycznie krotek. Musisz dodać przecinek po ciągu, aby wskazać Pythonowi, że powinien to być krotka.

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

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

Aby naprawić przykładowy kod, dodaj tutaj przecinki:

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

             ^       ^

Z dokumentów Python :

Szczególnym problemem jest konstrukcja krotek zawierających 0 lub 1 elementów: składnia ma kilka dodatkowych dziwactw, aby je uwzględnić. Puste krotki są konstruowane za pomocą pustej pary nawiasów; krotka z jednym elementem jest konstruowana poprzez następowanie po wartości przecinkiem (nie wystarczy umieścić pojedynczej wartości w nawiasach). Brzydki, ale skuteczny.

Jeśli naprawdę nienawidzę składnię spływu przecinek, obejście jest przekazać listdo tuple()funkcji:

x = tuple(['a'])
Jonathon Reinhart
źródło
7
Nie jest to jednak zbyt eleganckie i wygląda trochę zagmatwane. Czy jest inny sposób?
Robert Moore
3
To nie wydaje się działać. Na przykład: krotka ("abc") (z lub bez dodatkowego przecinka) daje ('a', 'b', 'c'), podczas gdy ("abc",) daje ('abc'). Więc tuple () nie wydaje się być tutaj realną opcją.
Ben Farmer
3
@Ben Zapoznaj się z dokumentacją . tuple akceptuje iterowalne , którymi jest ciąg (iteruje po znakach). Jeśli nalegać na nie za pomocą przecinka tylną, a następnie dokonać listę pośredni: tuple(['abc']).
Jonathon Reinhart
Jasne, mówię tylko, że funkcja krotki nie neguje potrzeby stosowania przecinka.
Ben Farmer
1
@matanster Składnia języka nie uległa zmianie w tym zakresie. AFAIK problem jest taki sam dla Pythona 2 i 3.
Jonathon Reinhart
20

Twoje pierwsze dwa przykłady nie są krotkami, są łańcuchami. Krotki jednoelementowe wymagają końcowego przecinka, jak w:

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
Frédéric Hamidi
źródło
11

('a') nie jest krotką, ale tylko łańcuchem.

Musisz dodać dodatkowy przecinek na końcu, aby pythonwziąć je jako tuple: -

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>> 
Rohit Jain
źródło