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'>

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'])

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')]

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')]
>>> 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.