मैं पायथन में सेट ऑफ सेट कैसे बना सकता हूं?


126

मैं पायथन में सेट का एक सेट बनाने की कोशिश कर रहा हूं। मैं यह पता नहीं कर सकता कि यह कैसे करना है।

खाली सेट के साथ शुरू 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'

क्या पायथन में सेट का होना संभव है?

मैं सेट के एक बड़े संग्रह के साथ काम कर रहा हूं और मैं डुप्लिकेट सेट (ए 1, ए 2, ए 2, ...., का एक सेट बी) से निपटने में सक्षम नहीं होना चाहता हूं यदि एई = अज दो सेटों को "रद्द" करेगा।

जवाबों:


120

पाइथन की शिकायत है क्योंकि आंतरिक setवस्तुएं परस्पर परिवर्तनशील हैं और इस तरह से वे धोने योग्य नहीं हैं। समाधान frozensetआंतरिक सेटों के लिए उपयोग करना है, यह इंगित करने के लिए कि आपको उन्हें संशोधित करने का कोई इरादा नहीं है।


59

लोगों ने पहले ही उल्लेख किया है कि आप इसे एक फ्रेज़ेनसेट () के साथ कर सकते हैं , इसलिए मैं सिर्फ एक कोड जोड़ूंगा कि इसे कैसे प्राप्त किया जाए:

उदाहरण के लिए आप सूचियों की सूची से सेट का एक सेट बनाना चाहते हैं:

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))
मैट डॉज

18

frozensetअंदर का उपयोग करें ।


9
शायद आप पायथन में उत्परिवर्तनीय / अपरिवर्तनीय वस्तुओं के बारे में कुछ संकेत दे सकते हैं क्योंकि वह नया है?
सेठ जॉनसन

2
@ सेठ: मैं कर सकता था, लेकिन परिवर्तनशीलता कोई कारक नहीं है।
इग्नासियो वाज़केज़-अब्राम्स

बहुत बहुत धन्यवाद! अभी रीडिंग: म्यूटेबिलिटी। सूची के एक सेट की तरह लगता है भी काम कर सकते हैं, लेकिन Frozenset इसे पूरा करने के लिए लगता है। एक बार फिर धन्यवाद!
मैट

@ इग्नासियो ने मुझे लगा कि सेट में और कीच में चाबी हैश करने में सक्षम है और इसलिए अपरिवर्तनीय है।
सेठ जॉनसन

7
हसबेलिटी और म्यूटेबिलिटी आवश्यक रूप से परस्पर-अनन्य नहीं हैं। यह सिर्फ इतना होता है कि अधिकांश मूल पायथन प्रकार एक पैटर्न साझा करते हैं।
इग्नासियो वाज़केज़-अब्राम्स

3

तो मुझे भी वही समस्या थी। मैं एक डेटा संरचना बनाना चाहता था जो सेट के सेट के रूप में काम करती है। समस्या यह है कि सेट में अपरिवर्तनीय वस्तुएँ होनी चाहिए । तो, आप क्या कर सकते हैं बस इसे tuples के एक सेट के रूप में बनाते हैं। मेरे लिए यह ठीक रहा!

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
ट्यूपल्स में, तत्व आदेश मायने रखता है। इस प्रकार A.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4)), तीन अलग तत्वों को जोड़ने जाएगा, जबकि मूल प्रश्न "सेट के सेट", जिसका मतलब है कि के बारे में है (2,3,4), (4,3,2), (2,4,3)एक ही हैं।
बोरिस गोरेलिक

1

2020 तक, आधिकारिक पायथन प्रलेखनfrozenset सेट के सेट का प्रतिनिधित्व करने के लिए उपयोग करने की सलाह देता है ।


1
वाह यह बहुत दिलचस्प है कि PEP 416 (जमे हुए तानाशाह) को नहीं अपनाया गया और इसे 2012 में प्रस्तावित किया गया।
NikoNyrh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.