Konversi daftar menjadi tuple dengan Python


544

Saya mencoba mengubah daftar menjadi tuple.

Sebagian besar solusi di Google menawarkan kode berikut:

l = [4,5,6]
tuple(l)

Namun, kode ini menghasilkan pesan kesalahan ketika saya menjalankannya:

TypeError: objek 'tuple' tidak bisa dipanggil Bagaimana saya bisa memperbaiki masalah ini?


78
Apakah Anda menetapkan nama variabel di tupletempat lain sebelumnya?
eumiro

18
Tidak terlalu pilih-pilih, tetapi Anda mungkin juga tidak boleh menggunakan huruf kecil "el" sebagai nama variabel karena kemiripannya dengan 1. Sama halnya dengan modal "oh" karena kemiripannya dengan nol. Bahkan "li" jauh lebih mudah dibaca dibandingkan.
Albert Rothman

Jawaban:


815

Seharusnya bekerja dengan baik. Jangan gunakan tuple, listatau nama khusus lainnya sebagai nama variabel. Mungkin itulah yang menyebabkan masalah Anda.

>>> l = [4,5,6]
>>> tuple(l)
(4, 5, 6)

109

Memperluas komentar eumiro, biasanya tuple(l)akan mengubah daftar lmenjadi tuple:

In [1]: l = [4,5,6]

In [2]: tuple
Out[2]: <type 'tuple'>

In [3]: tuple(l)
Out[3]: (4, 5, 6)

Namun, jika Anda telah mendefinisikan ulang tuplemenjadi tuple daripada type tuple:

In [4]: tuple = tuple(l)

In [5]: tuple
Out[5]: (4, 5, 6)

maka Anda mendapatkan TypeError karena tuple itu sendiri tidak dapat dipanggil:

In [6]: tuple(l)
TypeError: 'tuple' object is not callable

Anda dapat memulihkan definisi asli tupledengan berhenti dan memulai kembali juru bahasa Anda, atau (terima kasih kepada @glglgl):

In [6]: del tuple

In [7]: tuple
Out[7]: <type 'tuple'>

29

Anda mungkin telah melakukan sesuatu seperti ini:

>>> tuple = 45, 34  # You used `tuple` as a variable here
>>> tuple
(45, 34)
>>> l = [4, 5, 6]
>>> tuple(l)   # Will try to invoke the variable `tuple` rather than tuple type.

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    tuple(l)
TypeError: 'tuple' object is not callable
>>>
>>> del tuple  # You can delete the object tuple created earlier to make it work
>>> tuple(l)
(4, 5, 6)

Inilah masalahnya ... Karena Anda telah menggunakan tuplevariabel untuk menyimpan yang tuple (45, 34)sebelumnya ... Jadi, sekarang tupleadalah objecttipetuple sekarang ...

Tidak ada lagi typedan karenanya, tidak lagi Callable.

Nevergunakan tipe bawaan apa pun sebagai nama variabel Anda ... Anda memang punya nama lain untuk digunakan. Gunakan nama sembarang untuk variabel Anda sebagai gantinya ...


25

Untuk menambahkan alternatif lain tuple(l), pada Python> = 3.5Anda dapat melakukan:

t = *l,  # or t = (*l,) 

pendek, sedikit lebih cepat tetapi mungkin mudah dibaca.

Ini pada dasarnya membongkar daftar ldi dalam tuple literal yang dibuat karena adanya koma tunggal ,.


Ps: Kesalahan yang Anda terima adalah karena menutupi nama tupleyaitu Anda ditugaskan untuk nama tuple di suatu tempat misalnya tuple = (1, 2, 3).

Menggunakan del tupleAnda harus baik untuk pergi.


4

Saya menemukan banyak jawaban terkini dan dijawab dengan benar tetapi akan menambahkan sesuatu yang baru ke tumpukan jawaban.

Dalam python ada cara tak terbatas untuk melakukan ini, berikut adalah beberapa contoh
cara Normal

>>> l= [1,2,"stackoverflow","python"]
>>> l
[1, 2, 'stackoverflow', 'python']
>>> tup = tuple(l)
>>> type(tup)
<type 'tuple'>
>>> tup
(1, 2, 'stackoverflow', 'python')

cara Pintar

>>>tuple(item for item in l)
(1, 2, 'stackoverflow', 'python')

Ingat tuple tidak berubah, digunakan untuk menyimpan sesuatu yang berharga. Misalnya kata sandi, kunci atau hash disimpan dalam tupel atau kamus. Jika pisau diperlukan mengapa menggunakan pedang untuk memotong apel. Gunakan dengan bijak, itu juga akan membuat program Anda efisien.


2
Apa keuntungan dari cara kedua?
Nenek Mencapai

@GrannyAching dalam definisi dunia modern tentang pintar ini terus berubah, karena ini adalah pendekatan malas yang dilakukan dalam satu baris, saya kira itu cara yang cerdas.
TheExorcist

1
tuple(l)(cara pertama) lebih pendek dari tuple(item for item in l)(cara kedua).
Nenek Mencapai
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.