Python'da bir Set Setini nasıl oluşturabilirim?


126

Python'da bir dizi set yapmaya çalışıyorum. Nasıl yapılacağını çözemiyorum.

Boş setten başlayarak xx:

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

ama anladım

TypeError: unhashable type: 'list'

veya

TypeError: unhashable type: 'set'

Python'da bir dizi sete sahip olmak mümkün mü?

Büyük bir set koleksiyonuyla uğraşıyorum ve yinelenen setlerle uğraşmak zorunda kalmamak istiyorum (A1, A2, .... setlerinden oluşan bir B seti, Ai = Aj ise iki set "iptal eder")

Yanıtlar:


121

Python şikayet ediyor çünkü iç setnesneler değişebilir ve bu nedenle hashable değil. Çözüm, frozensetonları değiştirmek gibi bir niyetinizin olmadığını göstermek için iç kümeler için kullanmaktır .


59

İnsanlar bunu bir frozenset () ile yapabileceğinden bahsetti , bu yüzden bunu nasıl başaracağıma dair bir kod ekleyeceğim:

Örneğin, aşağıdaki liste listesinden bir set seti oluşturmak istiyorsunuz:

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

setinizi şu şekilde oluşturabilirsiniz:

t1 = set(frozenset(i) for i in t)

9
veya haritayı kullanabilirsiniz! set(map(frozenset, t))
Matt Dodge

18

frozensetİçeride kullanın .


9
Belki yeni olduğu için Python'daki değişken / değişmez nesneler hakkında birkaç ipucu verebilirsin?
Seth Johnson

2
@Seth: Yapabilirim ama değişkenlik bir faktör değil.
Ignacio Vazquez-Abrams

Çok teşekkürler! Şimdi sadece re: mutability'yi okuyorum. Görünüşe göre bir dizi liste de işe yarayabilir, ancak frozenset bunu başarmış gibi görünüyor. Tekrar teşekkürler!
Matt

@Ignacio Diktlerdeki setlerdeki ve anahtarlardaki üyelerin hash özellikli ve bu nedenle değişmez olması gerektiğini düşündüm.
Seth Johnson

7
Karıştırılabilirlik ve değiştirilebilirlik, mutlaka birbirini dışlamaz. Öyle ki, temel Python türlerinin çoğu bir kalıbı paylaşır.
Ignacio Vazquez-Abrams

3

Yani aynı sorunu yaşadım. Bir set kümesi olarak çalışan bir veri yapısı yapmak istedim. Sorun, setlerin değişmez nesneler içermesi gerektiğidir . Yani, yapabileceğiniz şey onu basitçe bir dizi demet haline getirmektir. Bu benim için iyi çalıştı!

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
Tuplelarda eleman sırası önemlidir. Böylece A.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4))orijinal soru ima "kümeler kümesi", yaklaşık iken, üç farklı eleman katacak (2,3,4), (4,3,2), (2,4,3)aynıdır.
Boris Gorelik

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.