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)

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.


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)

9
atau Anda bisa menggunakan peta! set(map(frozenset, t))
— Matt Dodge

18

Gunakan frozensetdi dalam.


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!

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.


1
Wow ini sangat menarik mengingat PEP 416 (dikt yang dibekukan) tidak diadopsi dan diusulkan pada tahun 2012.
— NikoNyrh
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.