Bagaimana saya bisa membuat satu set dengan Python?

126

Saya mencoba membuat satu set set dengan Python. Saya tidak tahu bagaimana melakukannya.

Dimulai dengan set kosong xx:

xx = set([])
# Now we have some other set, for example
elements = set([2,3,4])
xx.add(elements)

tapi saya mengerti

TypeError: unhashable type: 'list'

atau

TypeError: unhashable type: 'set'

Apakah mungkin memiliki satu set set dengan Python?

Saya berurusan dengan banyak koleksi set dan saya ingin tidak harus berurusan dengan set duplikat (set B dari set A1, A2, ...., An akan "membatalkan" dua set jika Ai = Aj)

Matt
sumber

Jawaban:

120

Keluhan Python karena setobjek dalam bisa berubah dan karenanya tidak bisa dicirikan. Solusinya adalah dengan menggunakan frozensetset dalam, untuk menunjukkan bahwa Anda tidak berniat untuk memodifikasinya.

a3nm
sumber
59

Orang-orang telah menyebutkan bahwa Anda dapat melakukan ini dengan frozenset () , jadi saya hanya akan menambahkan kode bagaimana mencapai ini:

Misalnya Anda ingin membuat sekumpulan set dari daftar daftar berikut:

t = [[], [1, 2], [5], [1, 2, 5], [1, 2, 3, 4], [1, 2, 3, 6]]

Anda dapat membuat set Anda dengan cara berikut:

t1 = set(frozenset(i) for i in t)
Salvador Dali
sumber
9
atau Anda bisa menggunakan peta! set(map(frozenset, t))
Matt Dodge
18

Gunakan frozensetdi dalam.

Ignacio Vazquez-Abrams
sumber
9
Mungkin Anda bisa memberikan beberapa petunjuk tentang objek yang bisa berubah / tidak bisa diubah dengan Python karena dia baru?
Seth Johnson
2
@ Set: Saya bisa, tapi mutabilitas bukanlah faktor.
Ignacio Vazquez-Abrams
Terima kasih banyak! Baru membaca re: mutability sekarang. Sepertinya sekumpulan daftar juga dapat bekerja tetapi frozenset tampaknya menyelesaikannya. Terima kasih lagi!
Matt
@Ignacio Saya berpikir bahwa anggota dalam set dan kunci di dicts harus dapat di-hash dan karenanya tidak dapat diubah.
Seth Johnson
7
Hashabilitas dan mutabilitas tidak selalu eksklusif. Kebetulan sebagian besar jenis Python dasar berbagi pola.
Ignacio Vazquez-Abrams
3

Jadi saya punya masalah yang sama persis. Saya ingin membuat struktur data yang berfungsi sebagai satu set set. Masalahnya adalah bahwa set harus berisi objek yang tidak dapat diubah . Jadi, yang dapat Anda lakukan hanyalah menjadikannya sebagai satu set tupel. Itu bekerja dengan baik untuk saya!

A = set()
A.add( (2,3,4) )##adds the element
A.add( (2,3,4) )##does not add the same element
A.add( (2,3,5) )##adds the element, because it is different!
gemetar
sumber
22
Dalam tupel, urutan elemen penting. Dengan demikian A.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4))akan menambah tiga elemen yang berbeda, sementara pertanyaan awal adalah tentang "set set", yang menyiratkan bahwa (2,3,4), (4,3,2), (2,4,3)adalah sama.
Boris Gorelik
1

Pada tahun 2020, dokumentasi resmi Python menyarankan penggunaan frozensetuntuk merepresentasikan kumpulan set.

AtilioA
sumber
1
Wow ini sangat menarik mengingat PEP 416 (dikt yang dibekukan) tidak diadopsi dan diusulkan pada tahun 2012.
NikoNyrh