Apa bedanya?
Apa kelebihan / kekurangan tupel / daftar?
list
. ; D
Apa bedanya?
Apa kelebihan / kekurangan tupel / daftar?
list
. ; D
Jawaban:
Selain tuple yang tidak berubah ada juga perbedaan semantik yang harus memandu penggunaannya. Tuples adalah struktur data yang heterogen (yaitu, entri mereka memiliki arti yang berbeda), sedangkan daftar adalah urutan homogen. Tuples memiliki struktur, daftar memiliki urutan.
Menggunakan perbedaan ini membuat kode lebih eksplisit dan mudah dipahami.
Salah satu contoh adalah pasangan nomor halaman dan garis untuk lokasi referensi dalam sebuah buku, misalnya:
my_location = (42, 11) # page number, line number
Anda kemudian dapat menggunakan ini sebagai kunci dalam kamus untuk menyimpan catatan di lokasi. Daftar di sisi lain dapat digunakan untuk menyimpan banyak lokasi. Secara alami seseorang mungkin ingin menambah atau menghapus lokasi dari daftar, jadi masuk akal bahwa daftar bisa berubah. Di sisi lain, tidak masuk akal untuk menambahkan atau menghapus item dari lokasi yang ada - maka tuple tidak dapat diubah.
Mungkin ada situasi di mana Anda ingin mengubah item dalam tuple lokasi yang ada, misalnya saat beralih melalui baris halaman. Tetapi tuple immutability memaksa Anda untuk membuat tuple lokasi baru untuk setiap nilai baru. Ini tampaknya tidak nyaman di muka itu, tetapi menggunakan data abadi seperti ini adalah landasan jenis nilai dan teknik pemrograman fungsional, yang dapat memiliki keuntungan besar.
Ada beberapa artikel menarik tentang masalah ini, misalnya "Python Tuples Bukan Hanya Daftar Konstan" atau "Memahami tupel vs daftar dengan Python" . Dokumentasi Python resmi juga menyebutkan ini
"Tuples tidak berubah, dan biasanya mengandung urutan heterogen ...".
Dalam bahasa yang diketik secara statis seperti Haskell nilai-nilai dalam sebuah tuple umumnya memiliki tipe yang berbeda dan panjang tuple harus diperbaiki. Dalam daftar, semua nilai memiliki tipe yang sama dan panjangnya tidak tetap. Jadi perbedaannya sangat jelas.
Akhirnya ada namesuple di Python, yang masuk akal karena tuple sudah seharusnya memiliki struktur. Ini menggarisbawahi gagasan bahwa tuple adalah alternatif yang ringan untuk kelas dan instance.
collections.namedtuple
lebih baik dipanggil collections.record
. Tidak masuk akal untuk bertukar, katakanlah, nama dan alamat dalam catatan pelanggan; pada kenyataannya, melakukan hal itu biasanya merupakan kesalahan, yang ketidakmampuan tuple mencegah Anda melakukan.
What would you do with such a list?
, saya selalu menggigil ketika ppl menggunakan kurangnya fantasi sebagai argumen. Menggunakan daftar tipe campuran bekerja sangat baik misalnya untuk beberapa struktur data hierarkis, di mana setiap daftar terdiri dari daftar anak dan elemen nilai.
Perbedaan antara daftar dan tupel
Harfiah
someTuple = (1,2)
someList = [1,2]
Ukuran
a = tuple(range(1000))
b = list(range(1000))
a.__sizeof__() # 8024
b.__sizeof__() # 9088
Karena ukuran operasi tuple yang lebih kecil, itu menjadi sedikit lebih cepat, tetapi tidak banyak untuk disebutkan sampai Anda memiliki sejumlah besar elemen.
Operasi yang diizinkan
b = [1,2]
b[0] = 3 # [3, 2]
a = (1,2)
a[0] = 3 # Error
Itu juga berarti bahwa Anda tidak dapat menghapus elemen atau mengurutkan tuple. Namun, Anda bisa menambahkan elemen baru ke daftar dan tuple dengan satu-satunya perbedaan bahwa karena tuple tidak berubah, Anda tidak benar - benar menambahkan elemen tetapi Anda membuat tuple baru, sehingga id akan berubah
a = (1,2)
b = [1,2]
id(a) # 140230916716520
id(b) # 748527696
a += (3,) # (1, 2, 3)
b += [3] # [1, 2, 3]
id(a) # 140230916878160
id(b) # 748527696
Pemakaian
Karena daftar bisa berubah, itu tidak dapat digunakan sebagai kunci dalam kamus, sedangkan tuple dapat digunakan.
a = (1,2)
b = [1,2]
c = {a: 1} # OK
c = {b: 1} # Error
3. Permitted operation
menunjukkan case tuple terlebih dahulu. Saya tahu itu biasa untuk menunjukkan kesuksesan daripada kesalahan, tetapi itu mengacaukan kepala saya selama beberapa saat.
one_item_list = [a]
, tetapi one_tuple = (a,)
merupakan tupel yang sesuai. Perhatikan koma mengikuti nama variabel. Tapi perhatikan juga two_tuple = (a, b)
. Ini melemparkan saya lebih dari sekali (masih ada di Python 3).
tuple(sorted(the_unsorted_tuple))
Jika Anda berjalan-jalan, Anda bisa mencatat koordinat Anda kapan saja dalam sebuah (x,y)
tuple.
Jika Anda ingin merekam perjalanan Anda, Anda dapat menambahkan lokasi Anda setiap beberapa detik ke daftar.
Tetapi Anda tidak bisa melakukannya sebaliknya.
Perbedaan utama adalah bahwa tuple tidak dapat diubah. Ini berarti bahwa Anda tidak dapat mengubah nilai-nilai dalam sebuah tuple setelah Anda membuatnya.
Jadi, jika Anda perlu mengubah nilai, gunakan Daftar.
Manfaat untuk tuple:
frozenset
atau berbagai dikte / pohon beku pihak ketiga lainnya. jenis, tetapi tidak ada yang memungkinkan Anda untuk menambahkan elemen yang bisa berubah. (Dan tentu saja tuple hanya dapat dip hash jika semua elemennya, yang menangani dengan cara EAFP biasa, jadi d[1, [2]]
akan dinaikkan TypeError: unhashable type: 'list'
).
Daftar bisa berubah; tuple tidak.
Dari docs.python.org/2/tutorial/datastructures.html
Tuples tidak dapat diubah, dan biasanya berisi urutan elemen yang heterogen yang diakses melalui pembongkaran (lihat nanti di bagian ini) atau pengindeksan (atau bahkan berdasarkan atribut dalam kasus namesuple). Daftar bisa berubah, dan unsur-unsurnya biasanya homogen dan diakses dengan mengulangi daftar.
Telah disebutkan bahwa perbedaannya sebagian besar bersifat semantik: orang mengharapkan tuple dan daftar untuk mewakili informasi yang berbeda. Tapi ini lebih dari sekadar panduan; beberapa perpustakaan benar-benar berperilaku berbeda berdasarkan apa yang disahkan. Ambil NumPy sebagai contoh (disalin dari pos lain tempat saya meminta lebih banyak contoh):
>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
[3, 4, 5]])
Intinya adalah, meskipun NumPy mungkin bukan bagian dari perpustakaan standar, ini adalah a pustaka Python utama , dan dalam daftar NumPy dan tupel adalah hal yang sangat berbeda.
type(a_list) != type(a_tuple)
, jadi setiap potongan kode perpustakaan yang didasarkan pada type(x)
akan berperilaku berbeda
'%d %d' % [2, 3]
adalah a TypeError
, karena Anda mencoba meneruskan daftar ke yang pertama %d
dan Anda tidak memberikan nilai apa pun ke yang kedua %d
. (Namun, ada juga contoh tandingannya, seperti max
...)
Daftar untuk looping, tuple untuk struktur yaitu "%s %s" %tuple
.
Daftar biasanya homogen, tupel biasanya heterogen.
Daftar untuk panjang variabel, tuple untuk panjang tetap.
Ini adalah contoh daftar Python:
my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]
Ini adalah contoh Python tuple:
my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")
Daftar dan tupel Python serupa karena keduanya merupakan kumpulan nilai yang dipesan. Selain perbedaan dangkal yang dibuat daftar menggunakan tanda kurung "[..., ...]" dan tupel menggunakan tanda kurung "(..., ...)", inti teknis "hard coded in Python syntax" perbedaan di antara mereka adalah bahwa elemen-elemen dari tuple tertentu tidak dapat diubah sedangkan daftar dapat berubah (... jadi hanya tuple yang dapat hashable dan dapat digunakan sebagai kamus / kunci hash!). Hal ini menimbulkan perbedaan dalam bagaimana mereka dapat atau tidak dapat digunakan (ditegakkan secara apriori oleh sintaksis) dan perbedaan dalam bagaimana orang memilih untuk menggunakannya (didorong sebagai 'praktik terbaik,' a posteriori, inilah yang dilakukan oleh para programmer yang pintar ). orang memberi pada urutan elemen.
Untuk tupel, 'pesanan' tidak lebih dari sekadar 'struktur' spesifik untuk menyimpan informasi. Nilai apa yang ditemukan di bidang pertama dapat dengan mudah beralih ke bidang kedua karena masing-masing memberikan nilai di dua dimensi atau skala yang berbeda. Mereka memberikan jawaban untuk berbagai jenis pertanyaan dan biasanya dalam bentuk: untuk objek / subjek tertentu, apa atributnya? Objek / subjek tetap konstan, atributnya berbeda.
Untuk daftar, 'pesanan' menandakan urutan atau arah. Elemen kedua HARUS datang setelah elemen pertama karena diposisikan di tempat ke-2 berdasarkan skala atau dimensi tertentu dan umum. Unsur-unsur diambil secara keseluruhan dan sebagian besar memberikan jawaban untuk satu pertanyaan yang biasanya berupa, untuk atribut yang diberikan, bagaimana objek / subjek ini dibandingkan? Atribut tetap konstan, objek / subjek berbeda.
Ada banyak contoh orang dalam budaya populer dan pemrogram yang tidak sesuai dengan perbedaan-perbedaan ini dan ada banyak orang yang mungkin menggunakan garpu salad untuk hidangan utama mereka. Pada akhirnya, tidak masalah dan keduanya biasanya dapat menyelesaikan pekerjaan.
Untuk meringkas beberapa detail yang lebih baik
Kesamaan:
Pengindeksan, Memilih, & Mengiris - Kedua tupel dan daftar indeks menggunakan nilai integer yang ditemukan dalam kurung. Jadi, jika Anda menginginkan 3 nilai pertama dari daftar atau tuple yang diberikan, sintaksnya akan sama:
>>> my_list[0:3]
[0,1,2]
>>> my_tuple[0:3]
[a,b,c]
Membandingkan & Menyortir - Dua tupel atau dua daftar keduanya dibandingkan oleh elemen pertama mereka, dan jika ada dasi, maka oleh elemen kedua, dan seterusnya. Tidak ada perhatian lebih lanjut diberikan pada elemen berikutnya setelah elemen sebelumnya menunjukkan perbedaan.
>>> [0,2,0,0,0,0]>[0,0,0,0,0,500]
True
>>> (0,2,0,0,0,0)>(0,0,0,0,0,500)
True
Perbedaan: - A priori, menurut definisi
Sintaks - Daftar menggunakan [], tupel gunakan ()
Mutability - Elemen dalam daftar yang diberikan bisa berubah, elemen dalam tuple yang diberikan TIDAK bisa berubah.
# Lists are mutable:
>>> top_rock_list
['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son']
>>> top_rock_list[1]
'Kashmir'
>>> top_rock_list[1] = "Stairway to Heaven"
>>> top_rock_list
['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son']
# Tuples are NOT mutable:
>>> celebrity_tuple
('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead')
>>> celebrity_tuple[5]
'Dead'
>>> celebrity_tuple[5]="Alive"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Hashtable (Kamus) - Sebagai hashtable (kamus) mensyaratkan bahwa kuncinya dapat di hashable dan karenanya tidak dapat diubah, hanya tuple yang dapat bertindak sebagai kunci kamus, bukan daftar.
#Lists CAN'T act as keys for hashtables(dictionaries)
>>> my_dict = {[a,b,c]:"some value"}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
#Tuples CAN act as keys for hashtables(dictionaries)
>>> my_dict = {("John","Wayne"): 90210}
>>> my_dict
{('John', 'Wayne'): 90210}
Perbedaan - Posteriori, dalam penggunaan
Homo vs Heterogenitas Elemen - Umumnya objek daftar adalah homogen dan objek tupel heterogen. Artinya, daftar digunakan untuk objek / subjek dengan tipe yang sama (seperti semua kandidat presiden, atau semua lagu, atau semua pelari) sedangkan walaupun itu tidak dipaksakan oleh), sedangkan tupel lebih untuk objek heterogen.
Looping vs. Structures - Meskipun keduanya memungkinkan untuk diulang (untuk x di my_list ...), itu hanya masuk akal untuk melakukannya untuk daftar. Tuples lebih sesuai untuk menyusun dan menyajikan informasi (% s% s berada di% s adalah% s dan saat ini% s% ("John", "Wayne", 90210, "Aktor", "Mati"))
Tuples dan daftar keduanya jenis urutan yang tampaknya sama dalam Python.
Sintaks literal
Kami menggunakan tanda kurung ( ) untuk membuat tupel dan tanda kurung siku
[ ]
untuk mendapatkan daftar baru. Juga, kita dapat menggunakan panggilan dari tipe yang sesuai untuk mendapatkan struktur yang dibutuhkan - tuple atau daftar.
someTuple = (4,6)
someList = [2,6]
Mutabilitas
Tuple tidak dapat diubah, sementara daftar dapat berubah. Titik ini adalah dasar untuk yang berikut.
Penggunaan memori
Karena mutabilitas, Anda memerlukan lebih banyak memori untuk daftar dan lebih sedikit memori untuk tupel.
Memperluas
Anda dapat menambahkan elemen baru ke kedua tupel dan daftar dengan satu-satunya perbedaan bahwa id tupel akan diubah (yaitu, kita akan memiliki objek baru).
Hashing
Tuples hashable dan daftarnya tidak. Ini berarti bahwa Anda dapat menggunakan tuple sebagai kunci dalam kamus. Daftar tidak dapat digunakan sebagai kunci dalam kamus, sedangkan tuple dapat digunakan
tup = (1,2)
list_ = [1,2]
c = {tup : 1} # ok
c = {list_ : 1} # error
Semantik
Poin ini lebih tentang praktik terbaik. Anda harus menggunakan tupel sebagai struktur data yang heterogen, sementara daftar adalah urutan yang homogen.
Daftar dimaksudkan untuk urutan yang homogen, sedangkan tupel adalah struktur data yang heterogen.
Seperti yang sudah dijawab orang di sini yang tuples
tidak dapat diubah sementara lists
bisa berubah, tetapi ada satu aspek penting dalam menggunakan tuple yang harus kita ingat
Jika tuple
mengandung alist
atau dictionary
di dalamnya, itu dapat diubah bahkan jika tuple
itu sendiri tidak berubah.
Misalnya, mari kita asumsikan kita memiliki sebuah tuple yang berisi daftar dan kamus
my_tuple = (10,20,30,[40,50],{ 'a' : 10})
kita dapat mengubah isi daftar sebagai
my_tuple[3][0] = 400
my_tuple[3][1] = 500
yang membuat tuple baru terlihat seperti
(10, 20, 30, [400, 500], {'a': 10})
kami juga dapat mengubah kamus di dalam tuple sebagai
my_tuple[4]['a'] = 500
yang akan membuat tuple keseluruhan terlihat seperti
(10, 20, 30, [400, 500], {'a': 500})
Ini terjadi karena list
dan dictionary
adalah benda-benda dan benda-benda ini tidak berubah, tapi isi menunjuk ke.
Jadi tuple
tetap tidak berubah tanpa kecuali
The PEP 484 - Type Hints mengatakan bahwa tipe elemen a tuple
dapat diketik secara individual; sehingga Anda bisa mengatakan Tuple[str, int, float]
; tetapi a list
, dengan List
kelas pengetikan hanya dapat mengambil satu tipe parameter List[str]
:, yang mengisyaratkan bahwa perbedaan dari 2 sebenarnya adalah bahwa yang pertama adalah heterogen, sedangkan yang terakhir pada dasarnya homogen.
Juga, pustaka standar sebagian besar menggunakan tupel sebagai nilai balik dari fungsi standar tersebut di mana C akan mengembalikan a struct
.
Karena orang telah menyebutkan perbedaannya, saya akan menulis tentang mengapa tuple.
Mengapa tuple lebih disukai?
Pengoptimalan alokasi untuk tupel kecil
Untuk mengurangi fragmentasi memori dan mempercepat alokasi, Python menggunakan kembali tupel lama. Jika sebuah tuple tidak lagi diperlukan dan memiliki kurang dari 20 item alih-alih menghapusnya secara permanen, Python memindahkannya ke daftar gratis.
Daftar gratis dibagi menjadi 20 grup, di mana setiap grup mewakili daftar panjang tupel n antara 0 dan 20. Setiap grup dapat menyimpan hingga 2.000 tupel. Grup pertama (nol) hanya berisi 1 elemen dan mewakili tuple kosong.
>>> a = (1,2,3)
>>> id(a)
4427578104
>>> del a
>>> b = (1,2,4)
>>> id(b)
4427578104
Pada contoh di atas kita dapat melihat bahwa a dan b memiliki id yang sama. Itu karena kami segera menduduki tuple hancur yang ada di daftar gratis.
Pengoptimalan alokasi untuk daftar
Karena daftar dapat dimodifikasi, Python tidak menggunakan optimasi yang sama seperti pada tupel. Namun, daftar Python juga memiliki daftar gratis, tetapi hanya digunakan untuk objek kosong. Jika daftar kosong dihapus atau dikumpulkan oleh GC, itu dapat digunakan kembali nanti.
>>> a = []
>>> id(a)
4465566792
>>> del a
>>> b = []
>>> id(b)
4465566792
Sumber: https://rushter.com/blog/python-lists-and-tuples/
Mengapa tuple lebih efisien daripada daftar? -> https://stackoverflow.com/a/22140115
Kutipan arah dari dokumentasi pada 5.3. Tuples and Sequences :
Meskipun tupel mungkin mirip dengan daftar, tupel sering digunakan dalam situasi yang berbeda dan untuk tujuan yang berbeda. Tuples tidak dapat diubah , dan biasanya berisi urutan elemen yang heterogen yang diakses melalui pembongkaran (lihat nanti di bagian ini) atau pengindeksan (atau bahkan berdasarkan atribut dalam kasus namesuple). Daftar bisa berubah , dan unsur-unsurnya biasanya homogen dan diakses dengan mengulangi daftar.
Pertama-tama, mereka berdua adalah objek non-skalar (juga dikenal sebagai objek gabungan) dalam Python.
+
(tuple baru akan dibuat tentu saja)(3,) # -> (3)
bukan(3) # -> 3
[3]
new_array = origin_array[:]
[x**2 for x in range(1,7)]
memberi Anda
[1,4,9,16,25,36]
(Tidak terbaca)Menggunakan daftar juga dapat menyebabkan bug aliasing (dua jalur berbeda yang menunjuk ke objek yang sama).
Daftar bisa berubah dan tuple tidak berubah. Perhatikan saja contoh ini.
a = ["1", "2", "ra", "sa"] #list
b = ("1", "2", "ra", "sa") #tuple
Sekarang ubah nilai indeks daftar dan tupel.
a[2] = 1000
print a #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b #output : TypeError: 'tuple' object does not support item assignment.
Karenanya terbukti kode berikut tidak valid dengan tuple, karena kami berusaha memperbarui tuple, yang tidak diizinkan.
Daftar bisa berubah dan tuple tidak berubah. Perbedaan utama antara bisa berubah dan tidak dapat diubah adalah penggunaan memori ketika Anda mencoba untuk menambahkan item.
Saat Anda membuat variabel, beberapa memori tetap ditugaskan ke variabel. Jika itu daftar, lebih banyak memori yang diberikan daripada yang sebenarnya digunakan. Misal, jika penugasan memori saat ini adalah 100 byte, ketika Anda ingin menambahkan byte ke 101, mungkin 100 byte lainnya akan ditetapkan (total 200 byte dalam kasus ini).
Namun, jika Anda tahu bahwa Anda tidak sering menambahkan elemen baru, maka Anda harus menggunakan tuple. Tuples menetapkan ukuran persis dari memori yang dibutuhkan, dan karenanya menghemat memori, terutama ketika Anda menggunakan blok memori yang besar.