Cara membuat tupel hanya dengan satu elemen

107

Dalam contoh di bawah ini saya akan mengharapkan semua elemen menjadi tupel, mengapa tupel dikonversi menjadi string ketika hanya berisi satu 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
sumber
1
('a')baru saja mengevaluasi ke'a'
oldrinb
1
Wow - 3 jawaban benar dalam 3 menit :) Namun, perhatikan rahasia ,:a = 1, 2, 3; print a
26
Tanda kurung tidak membuat tupel, koma bisa.
cdarke
17
@cdarke, kecuali untuk tupel kosong (), yang hanya terdiri dari sepasang tanda kurung.
Frédéric Hamidi
2
Benar, atau lebih tepatnya, False- hampir semua tupel kosong bagus untuk (jika Anda mengerti maksud saya).
cdarke

Jawaban:

140

Karena dua elemen pertama itu bukanlah tupel; mereka hanya string. Tanda kurung tidak secara otomatis menjadikannya tupel. Anda harus menambahkan koma setelah string untuk menunjukkan pada python bahwa itu adalah tupel.

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

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

Untuk memperbaiki kode contoh Anda, tambahkan koma di sini:

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

             ^       ^

Dari Dokumen Python :

Masalah khusus adalah konstruksi tupel yang berisi 0 atau 1 item: sintaks memiliki beberapa kebiasaan tambahan untuk mengakomodasi ini. Tupel kosong dibuat oleh sepasang tanda kurung kosong; sebuah tupel dengan satu item dibuat dengan mengikuti nilai dengan koma (tidak cukup untuk menyertakan satu nilai dalam tanda kurung). Jelek, tapi efektif.

Jika Anda benar-benar membenci sintaksis tanda koma, solusinya adalah dengan meneruskan a listke tuple()fungsi:

x = tuple(['a'])
Jonathon Reinhart
sumber
7
Ini tidak terlalu elegan dan terlihat agak membingungkan. Apakah ada cara lain?
Robert Moore
3
Sepertinya itu tidak berhasil. Misalnya: tuple ("abc") (dengan atau tanpa tambahan koma) memberi ('a', 'b', 'c'), sementara ("abc",) memberi ('abc'). Jadi tuple () tampaknya bukan opsi yang layak di sini.
Ben Farmer
3
@Ben Silahkan lihat di docs . tuple menerima iterable , yaitu string (iterasi atas karakter). Jika Anda bersikeras tidak menggunakan trailing koma, kemudian membuat daftar menengah: tuple(['abc']).
Jonathon Reinhart
Tentu, saya hanya mengatakan bahwa fungsi tupel tidak meniadakan kebutuhan akan koma.
Ben Farmer
1
@matanster Sintaks bahasa tidak berubah dalam hal ini. AFAIK masalahnya sama untuk Python 2 dan 3.
Jonathon Reinhart
20

Dua contoh pertama Anda bukanlah tupel, melainkan string. Tupel item tunggal membutuhkan tanda koma, seperti pada:

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

('a') bukan tupel, melainkan hanya sebuah string.

Anda perlu menambahkan koma tambahan di akhir untuk menjadikannya pythonsebagai tuple: -

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