ฉันจะสร้างชุดของชุดใน Python ได้อย่างไร


126

ฉันกำลังพยายามสร้างชุดใน Python ฉันคิดไม่ออกว่าจะทำอย่างไร

เริ่มต้นด้วยชุดว่างxx:

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

แต่ฉันเข้าใจ

TypeError: unhashable type: 'list'

หรือ

TypeError: unhashable type: 'set'

เป็นไปได้ไหมที่จะมีชุดของชุดใน Python?

ฉันกำลังจัดการกับชุดสะสมจำนวนมากและฉันต้องการที่จะไม่ต้องจัดการกับชุดที่ซ้ำกัน (ชุด B ของชุด A1, A2, .... , ฉันจะ "ยกเลิก" สองชุดถ้า Ai = Aj)

คำตอบ:


121

การบ่นของ Python เนื่องจากsetวัตถุภายในไม่แน่นอนและไม่สามารถแฮชได้ วิธีแก้ปัญหาคือใช้frozensetสำหรับชุดชั้นในเพื่อระบุว่าคุณไม่มีเจตนาที่จะแก้ไข


59

มีคนพูดถึงแล้วว่าคุณสามารถทำได้ด้วยfrozenset ()ดังนั้นฉันจะเพิ่มรหัสเพื่อบรรลุสิ่งนี้:

ตัวอย่างเช่นคุณต้องการสร้างชุดของชุดจากรายการต่อไปนี้:

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

คุณสามารถสร้างชุดของคุณได้ด้วยวิธีต่อไปนี้:

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

9
หรือคุณสามารถใช้แผนที่! set(map(frozenset, t))
Matt Dodge

18

ใช้frozensetภายใน.


9
บางทีคุณอาจให้คำแนะนำเกี่ยวกับวัตถุที่เปลี่ยนแปลงไม่ได้ / ไม่เปลี่ยนรูปใน Python ตั้งแต่ยังใหม่
Seth Johnson

2
@ เซ ธ : ฉันทำได้ แต่ความผันแปรไม่ใช่ปัจจัย
Ignacio Vazquez-Abrams

ขอบคุณมาก ๆ! เพิ่งอ่าน re: mutability ตอนนี้ ดูเหมือนว่าชุดของรายการอาจใช้งานได้ แต่ดูเหมือนว่า Frozenset จะเสร็จสิ้น ขอบคุณอีกครั้ง!
Matt

@Ignacio ฉันคิดว่าสมาชิกในเซตและคีย์ในคำสั่งจะต้องแฮชได้จึงไม่เปลี่ยนรูป
Seth Johnson

7
ความสามารถในการแฮชและความสามารถในการเปลี่ยนแปลงไม่จำเป็นต้องเป็นเอกเทศ มันก็เกิดขึ้นที่ Python พื้นฐานส่วนใหญ่แบ่งปันรูปแบบ
Ignacio Vazquez-Abrams

3

ดังนั้นฉันจึงมีปัญหาเดียวกัน ฉันต้องการสร้างโครงสร้างข้อมูลที่ทำงานเป็นชุดของชุด ปัญหาคือชุดต้องมีวัตถุที่ไม่เปลี่ยนรูป ดังนั้นสิ่งที่คุณทำได้ก็แค่ทำให้มันเป็นชุดของสิ่งที่ดึงดูดใจ นั่นใช้ได้ดีสำหรับฉัน!

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
ใน tuples ลำดับองค์ประกอบมีความสำคัญ ดังนั้นA.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4))จะเพิ่มสามองค์ประกอบที่แตกต่างกันในขณะที่คำถามเดิมเป็นเรื่องเกี่ยวกับ "ชุดชุด" ซึ่งหมายความว่า(2,3,4), (4,3,2), (2,4,3)เหมือนกัน
Boris Gorelik

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.