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.