Diuji menggunakan interpreter Python 2.6:
>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> a.add(l)
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
a.add(l)
TypeError: list objects are unhashable
Saya pikir saya tidak dapat menambahkan daftar ke set karena tidak ada cara Python dapat mengatakan jika saya telah menambahkan daftar yang sama dua kali. Apakah ada solusinya?
EDIT: Saya ingin menambahkan daftar itu sendiri, bukan elemennya.
Jawaban:
Anda tidak dapat menambahkan daftar ke set karena daftar bisa berubah, artinya Anda dapat mengubah konten daftar setelah menambahkannya ke set.
Namun Anda dapat menambahkan tupel ke set, karena Anda tidak dapat mengubah isi tupel:
Sunting : beberapa penjelasan: Dokumentasi mendefinisikan
set
sebagai kumpulan objek hashable berbeda yang tidak berurutan. Objek harus hashable sehingga menemukan, menambah dan menghapus elemen dapat dilakukan lebih cepat daripada melihat setiap elemen individu setiap kali Anda melakukan operasi ini. Algoritma spesifik yang digunakan dijelaskan dalam artikel Wikipedia . Algoritma hashing Python dijelaskan pada effbot.org dan__hash__
fungsi python dalam referensi python .Beberapa fakta:
list
: gunakantuple
sajaset
: gunakanfrozenset
sajadict
: tidak memiliki mitra resmi, tetapi ada beberapa resepsumber
collections.namedtuple
mungkin dianggap sebagai mitra "resmi" daridict
.Gunakan
set.update()
atau|=
sunting: Jika Anda ingin menambahkan daftar itu sendiri dan bukan anggotanya, maka Anda harus menggunakan tuple, sayangnya. Tetapkan anggota harus hashable .
sumber
|
operator mengimplementasikan operasi set union . Baik|=
operator danset.update()
metode menerapkan operasi itu di tempat dan secara efektif bersinonim. Jadi,set_a |= set_b
dapat dianggap sebagai gula sintaksis untuk keduanyaset_a.update(set_b)
danset_a = set_a | set_b
(kecuali bahwa dalam kasus yang terakhir,set_a
objek yang sama digunakan kembali alih-alih dipindahkan).</ahem>
Untuk menambahkan elemen daftar ke set , gunakan
update
Dari https://docs.python.org/2/library/sets.html
Misalnya
Jika Anda ingin menambahkan seluruh daftar sebagai elemen tunggal ke set, Anda tidak bisa karena daftar tidak dapat hashable. Anda bisa menambahkan tuple, mis
s.add(tuple(l))
. Lihat juga TypeError: tipe yang tidak dapat diakses: 'daftar' saat menggunakan fungsi set bawaan untuk informasi lebih lanjut tentang itu.sumber
Semoga ini membantu:
sumber
Mohon perhatikan fungsinya
set.update()
. Dokumentasi mengatakan:sumber
daftar objek tidak dapat diakses . Anda mungkin ingin mengubahnya menjadi tupel.
sumber
Set tidak dapat memiliki elemen / anggota yang dapat diubah (dapat diubah). Daftar, yang bisa berubah, tidak bisa menjadi anggota set.
Karena set dapat berubah, Anda tidak dapat memiliki satu set set! Anda dapat memiliki satu set frozenset.
(Jenis "persyaratan mutabilitas" yang sama berlaku untuk kunci-kunci dict.)
Jawaban lain sudah memberi Anda kode, saya harap ini memberikan sedikit wawasan. Saya berharap Alex Martelli akan menjawab dengan lebih detail.
sumber
Anda ingin menambahkan tupel, bukan daftar:
Jika Anda memiliki daftar, Anda dapat mengonversi ke tuple, seperti yang ditunjukkan di atas. Sebuah tuple tidak dapat diubah, sehingga dapat ditambahkan ke set.
sumber
Saya menemukan saya perlu melakukan sesuatu yang serupa hari ini. Algoritma tahu kapan itu membuat daftar baru yang perlu ditambahkan ke set, tetapi tidak ketika itu akan selesai beroperasi pada daftar.
Pokoknya, perilaku yang saya inginkan adalah untuk menggunakan
id
daripada mengaturhash
. Karena itu saya menemukanmydict[id(mylist)] = mylist
alih-alihmyset.add(mylist)
menawarkan perilaku yang saya inginkan.sumber
Anda akan ingin menggunakan tuple, yang hashable (Anda tidak bisa hash objek yang bisa berubah seperti daftar).
sumber
Beginilah biasanya saya melakukannya:
sumber
Ini harus dilakukan:
sumber