Pertanyaan Apa perbedaan antara daftar dan tupel?


Apa bedanya?

Apa keuntungan / kerugian dari tupel / daftar?


844
2018-03-09 15:41


asal


Jawaban:


Selain tupel yang berubah juga ada perbedaan semantik yang seharusnya memandu penggunaannya. Tuples adalah struktur data heterogen (yaitu, entri mereka memiliki arti yang berbeda), sedangkan daftar adalah urutan homogen. Tuples memiliki struktur, daftar memiliki pesanan. 

Menggunakan perbedaan ini membuat kode menjadi lebih jelas dan mudah dipahami.

Salah satu contohnya adalah pasangan halaman dan nomor baris ke 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 beberapa lokasi. Tentu saja orang mungkin ingin menambah atau menghapus lokasi dari daftar, sehingga masuk akal bahwa daftar bisa berubah. Di sisi lain tidak masuk akal untuk menambah atau menghapus item dari lokasi yang ada - sehingga tuples tidak dapat diubah.

Mungkin ada situasi di mana Anda ingin mengubah item dalam tupel lokasi yang ada, misalnya ketika iterasi melalui baris halaman. Namun keuletan tuple memaksa Anda untuk membuat tupel lokasi baru untuk setiap nilai baru. Hal ini tampaknya tidak nyaman di hadapannya, tetapi menggunakan data yang tidak berubah seperti ini adalah landasan dari jenis nilai dan teknik pemrograman fungsional, yang dapat memiliki keuntungan substansial.

Ada beberapa artikel menarik tentang masalah ini, mis. "Python Tuples Bukan Hanya Daftar Konstan" atau "Memahami tuples vs. list dalam Python". Dokumentasi resmi Python juga menyebutkan ini

"Tuples tidak dapat diubah, dan biasanya mengandung urutan heterogen ...".

Dalam bahasa yang diketik statis seperti Haskell nilai-nilai dalam tupel 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 namedtuple dengan Python, yang masuk akal karena tuple sudah seharusnya memiliki struktur. Ini menggarisbawahi gagasan bahwa tuple adalah alternatif yang ringan untuk kelas dan contoh.


881
2018-03-09 16:02



Perbedaan antara daftar dan tupel

  1. Harfiah

    someTuple = (1,2)
    someList  = [1,2] 
    
  2. Ukuran

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088
    

    Karena ukuran yang lebih kecil dari operasi tuple, itu menjadi sedikit lebih cepat, tetapi tidak banyak lagi tentang sampai Anda memiliki sejumlah besar elemen.

  3. Operasi yang diizinkan

    b    = [1,2]   
    b[0] = 3       # [3, 2]
    
    a    = (1,2)
    a[0] = 3       # Error
    

    Itu juga berarti Anda tidak dapat menghapus elemen atau mengurutkan tuple. Namun, Anda dapat menambahkan elemen baru ke daftar dan tupel dengan satu-satunya perbedaan bahwa Anda akan mengubah id tuple dengan menambahkan elemen

    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
    
  4. Pemakaian

    Karena daftar bisa berubah, 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
    

298
2017-09-19 11:07



Jika Anda berjalan-jalan, Anda dapat mencatat koordinat Anda kapan saja di (x,y) tuple.

Jika Anda ingin merekam perjalanan Anda, Anda bisa menambahkan lokasi Anda setiap beberapa detik ke daftar.

Tetapi Anda tidak bisa melakukannya dengan cara lain.


176
2018-03-09 17:14



Perbedaan utamanya adalah tupel tidak dapat diubah. Ini berarti Anda tidak dapat mengubah nilai dalam tuple setelah Anda membuatnya.

Jadi, jika Anda perlu mengubah nilai, gunakan Daftar.

Manfaat untuk tupel:

  1. Peningkatan kinerja sedikit.
  2. Karena tupel tidak dapat diubah, ia dapat digunakan sebagai kunci dalam kamus.
  3. Jika Anda tidak dapat mengubahnya, tidak dapat orang lain, yang berarti Anda tidak perlu khawatir tentang fungsi API, dll. Mengubah tupel Anda tanpa diminta.

69
2018-03-09 15:42



Daftar bisa berubah; tupel tidak.

Dari docs.python.org/2/tutorial/datastructures.html 

Tuples tidak dapat diubah, dan biasanya mengandung urutan heterogen   elemen yang diakses melalui pembongkaran (lihat nanti di bagian ini)   atau pengindeksan (atau bahkan menurut atribut dalam kasus namedtuples). Daftar   bisa berubah, dan elemen mereka biasanya homogen dan   diakses dengan iterasi di atas daftar.


30
2018-03-09 15:41



Daftar untuk perulangan, tupel untuk struktur, yaitu "%s %s" %tuple.

Daftar biasanya homogen, tupel biasanya heterogen.

Daftar untuk panjang variabel, tupel untuk panjang tetap.


18
2018-04-19 05:43



Nya telah disebutkan bahwa perbedaannya sebagian besar semantik: orang mengharapkan tuple dan daftar untuk mewakili informasi yang berbeda. Tapi ini lebih dari sekedar panduan; beberapa perpustakaan benar-benar berperilaku berbeda berdasarkan apa yang mereka lewati. Ambil NumPy misalnya (disalin dari pos lain di mana 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, sementara NumPy mungkin bukan bagian dari pustaka standar, itu a utama Perpustakaan Python, dan dalam daftar NumPy dan tupel adalah hal yang benar-benar berbeda.


17
2017-08-12 07:06



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 tuple Python:

my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")

Daftar python dan tupel serupa karena keduanya merupakan kumpulan nilai yang diurutkan. Selain perbedaan dangkal yang daftar dibuat menggunakan tanda kurung "[..., ...]" dan tupel menggunakan tanda kurung "(..., ...)", inti teknis "hard coded di Python sintaks" perbedaan antara mereka adalah bahwa elemen-elemen tuple tertentu tidak dapat diubah sedangkan daftar dapat berubah-ubah (... jadi hanya tupel yang dapat di-hash dan dapat digunakan sebagai kunci kamus / hash!). Hal ini menimbulkan perbedaan bagaimana mereka dapat atau tidak dapat digunakan (ditegakkan a priori oleh sintaks) dan perbedaan dalam cara orang memilih untuk menggunakannya (didorong sebagai 'praktik terbaik,' a posteriori, ini adalah apa pintar programmer lakukan). Perbedaan utama a posteriori dalam membedakan ketika tuples digunakan versus ketika daftar digunakan terletak pada apa berarti orang memberi kepada urutan elemen.

Untuk tupel, 'pesanan' berarti tidak lebih dari sekadar 'struktur' tertentu untuk menyimpan informasi. Nilai apa yang ditemukan di bidang pertama dapat dengan mudah dialihkan ke bidang kedua karena masing-masing menyediakan 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, 'urutan' menandakan urutan atau arah. Elemen kedua HARUS datang setelah elemen pertama karena diposisikan di tempat ke-2 berdasarkan skala dan dimensi tertentu dan umum. Unsur-unsur tersebut diambil secara keseluruhan dan sebagian besar memberikan jawaban atas satu pertanyaan yang biasanya berupa formulir, untuk atribut tertentu, bagaimana objek / subjek ini dibandingkan? Atribut tetap konstan, objek / subjek berbeda.

Ada banyak sekali contoh orang dalam budaya populer dan programer yang tidak sesuai dengan perbedaan ini dan ada banyak orang yang mungkin menggunakan salad fork untuk hidangan utama mereka. Pada akhirnya, tidak apa-apa dan keduanya biasanya bisa menyelesaikan pekerjaan.

Untuk meringkas beberapa detail yang lebih halus

Kesamaan:

  1. Duplikat - Baik tupel dan daftar memungkinkan duplikat
  2. Pengindeksan, Memilih, & Mengiris - Baik tupel dan daftar indeks menggunakan nilai bilangan bulat yang ditemukan dalam tanda kurung. Jadi, jika Anda menginginkan 3 nilai pertama dari daftar atau tupel yang diberikan, sintaksnya akan sama:

    >>> my_list[0:3]
    [0,1,2]
    >>> my_tuple[0:3]
    [a,b,c]
    
  3. Membandingkan & Menyortir - Dua tuple atau dua daftar keduanya dibandingkan dengan elemen pertama mereka, dan jika ada dasi, maka dengan elemen kedua, dan seterusnya. Tidak ada perhatian lebih lanjut yang dibayarkan kepada elemen selanjutnya 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

  1. Sintaksis - Daftar menggunakan [], penggunaan tupel ()

  2. Mutabilitas - Elemen dalam daftar yang diberikan dapat berubah, elemen dalam tuple yang diberikan TIDAK dapat 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
    
  3. Hashtables (Kamus) - Karena hashtables (kamus) mensyaratkan bahwa kuncinya dapat ditempa 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 - A posteriori, dalam penggunaan

  1. Homo vs Heterogeneity of Elements - Umumnya daftar objek yang homogen dan tuple object bersifat heterogen. Yaitu, daftar digunakan untuk objek / subjek dengan tipe yang sama (seperti semua kandidat presiden, atau semua lagu, atau semua pelari) sedangkan meskipun tidak dipaksa oleh), sedangkan tupel lebih untuk objek heterogen.

  2. Looping vs. Structures - Meskipun keduanya memungkinkan untuk looping (untuk x di my_list ...), itu hanya benar-benar masuk akal untuk melakukannya untuk daftar. Tuples lebih tepat untuk penataan dan penyajian informasi (% s% s berada di% s adalah% s dan saat ini% s% ("John", "Wayne", 90210, "Actor", "Dead"))


12
2018-03-22 13:48



Nilai-nilai dari daftar dapat diubah kapan saja tetapi nilai-nilai tupel tidak bisa diubah.

Itu keuntungan dan kerugian tergantung pada penggunaannya. Jika Anda memiliki data yang tidak ingin diubah, Anda harus menggunakan tupel, jika tidak daftar adalah opsi terbaik.


8
2018-06-06 11:14



Daftar dimaksudkan sebagai urutan homogen, sedangkan tupel adalah struktur data heterogen.


6
2018-03-09 20:29