2012-04-16 17 views
31

वहाँ का प्रतिनिधित्व करने के लिए एक "सेट" एक मानक तरीका है कि डुप्लिकेट तत्वों को शामिल कर सकते हैं है।अजगर "सेट" डुप्लिकेट/दोहराया तत्वों के साथ

मैं यह समझ के रूप में, एक सेट वास्तव में एक या एक से एक तत्व के शून्य है। मैं कार्यक्षमता चाहता हूं कि कोई संख्या हो।

मैं वर्तमान मूल्यों के रूप में कुंजी के रूप में तत्वों, और मात्रा के साथ एक शब्दकोश का उपयोग कर रहा है, लेकिन इस कई कारणों से गलत लगता है।

प्रेरणा: मुझे विश्वास है कि इस तरह के संग्रह के लिए कई एप्लिकेशन हैं। उदाहरण के लिए, पसंदीदा रंगों का एक सर्वेक्षण इस प्रकार प्रदर्शित किया जा सकता है: सर्वेक्षण = ['नीला', 'लाल', 'नीला', 'हरा']

यहां, मुझे आदेश की परवाह नहीं है, लेकिन मैं करता हूं मात्रा के बारे में। मैं जैसी चीजों क्या करना चाहते हैं:

survey.add('blue') 
# would give survey == ['blue', 'red', 'blue', 'green', 'blue'] 

... और शायद

survey.remove('blue') 
# would give survey == ['blue', 'red', 'green'] 

नोट्स: हाँ, सेट संग्रह के इस प्रकार के लिए सही शब्द नहीं है। क्या कोई और सही है?

पाठ्यक्रम की एक सूची काम करेगी, लेकिन आवश्यक संग्रह अनियंत्रित है। उल्लेख नहीं है कि सेट के लिए नामकरण विधि मुझे अधिक उचित लगता है।

+0

यह समझाने में सहायता कर सकता है कि आप ऐसा क्यों करना चाहते हैं। – jamylak

+2

यदि आपको डुप्लिकेट की आवश्यकता है तो यह परिभाषा द्वारा 'सेट' नहीं है। क्या आप दिखा सकते हैं कि आप क्या चाहते हैं, और शायद हम एक उपयुक्त कंटेनर या डेटा प्रकार का सुझाव दे सकते हैं? –

+2

हां, इसे "सूची" कहा जाता है – georg

उत्तर

30

आप multiset की तलाश में हैं।

अजगर के करीबी डेटाप्रकार collections.Counter है:

एक Counter hashable वस्तुओं की गणना के लिए एक dict उपवर्ग है। यह अनॉर्डर्ड संग्रह है जहां तत्वों को शब्दकोश कुंजी के रूप में संग्रहीत किया जाता है और उनकी गणना शब्दकोश मानों के रूप में संग्रहीत की जाती है। गिनता शून्य या नकारात्मक मायने रखता है सहित किसी भी पूर्णांक मान होने की अनुमति दी जाती है। Counter वर्ग अन्य भाषाओं में बैग या multisets के समान है।

एक मल्टीसेट का एक वास्तविक कार्यान्वयन के लिए, pypi पर डेटा संरचनाओं पैकेज से bag वर्ग का उपयोग करें। ध्यान दें कि यह केवल पायथन 3 के लिए है। यदि आपको पाइथन 2 की आवश्यकता है, here पाइथन 2.4 के लिए bag के लिए एक नुस्खा है।

+3

संग्रह के बीच क्या अंतर है काउंटर और पाइपी बैग? – max

+0

पायथन 2.7.6 पर मैं बैग चला सकता हूं, क्यों? – Zen

+5

यहां एक बड़ा गचाचा: 'लेन (counter_obj)' आपको अद्वितीय तत्वों की संख्या देता है लेकिन मल्टीसेट से अपेक्षा की जाने वाली तत्वों की कुल संख्या नहीं। लेकिन, आप सेट के साथ करते हुए यूनियनों और चौराहे जैसे अन्य सभी संचालन कर सकते हैं। – Phani

11

आपका तत्व/गिनती के साथ dict साथ दृष्टिकोण मेरे लिए ठीक लगता है। आपको शायद कुछ और कार्यक्षमता की आवश्यकता है। collections.Counter पर एक नज़र डालें।

  • हे (1) परीक्षण एक तत्व वर्तमान और वर्तमान गिनती पुनर्प्राप्ति
  • counter.elements() सब के साथ एक सूची की तरह दिखता है (element in list और list.count(element) साथ तुलना में तेजी से) डुप्लिकेट
  • आसान हेरफेर संघ/अन्य काउंटर के साथ अंतर है कि क्या
-2

यदि आपको डुप्लीकेट की आवश्यकता है, तो एक सूची का उपयोग करें, और सेट के रूप में कार्य करने की आवश्यकता होने पर इसे एक सेट में बदलें।

+1

यह सबसे अधिक संभावना है कि ओपी एक मल्टीसेट की तलाश में था, और एक सूची को एक सेट में बदलना डुप्लिकेट। – ComputerFellow

+0

मैंने इसे संपादित करने से पहले इस उत्तर को पोस्ट किया था। मेरा दृष्टिकोण केवल मूल सूची के दृश्य के रूप में सेट का उपयोग करता है। –

0

आप एक सादा list का उपयोग कर सकते हैं और जब भी आप तत्वों की "संख्या" तक पहुंचना चाहते हैं तो list.count(element) का उपयोग करें।

my_list = [1, 1, 2, 3, 3, 3] 

my_list.count(1) # will return 2 
0

एक वैकल्पिक पायथन मल्टीसेट कार्यान्वयन एक क्रमबद्ध सूची डेटा संरचना का उपयोग करता है। पीईपीआई पर कुछ कार्यान्वयन हैं। एक विकल्प sortedcontainers मॉड्यूल है जो SortedList डेटा प्रकार लागू करता है जो add, remove, और contains जैसे सेट-जैसी विधियों को कुशलतापूर्वक लागू करता है। सॉर्ट किए गए कंटेनर मॉड्यूल को शुद्ध-पायथन, फास्ट-ए-सी कार्यान्वयन (यहां तक ​​कि तेज़) में लागू किया गया है, इसमें 100% यूनिट परीक्षण कवरेज और तनाव परीक्षण के घंटे हैं।

स्थापना PyPI से आसान है:

pip install sortedcontainers 

आप नहीं pip install तो बस open-source repository से नीचे sortedlist.py फ़ाइल खींच कर सकते हैं।

आप एक सेट के रूप में यह प्रयोग करें:

from sortedcontainers import SortedList 
survey = SortedList(['blue', 'red', 'blue', 'green']] 
survey.add('blue') 
print survey.count('blue') # "3" 
survey.remove('blue') 

sortedcontainers मॉड्यूल भी अन्य लोकप्रिय कार्यान्वयन के साथ एक performance comparison बनाए रखता है।

0

क्या आप देख रहे हैं वास्तव में एक multiset (या बैग), जरूरी नहीं कि विशिष्ट तत्वों का एक संग्रह (जबकि सेट एक डुप्लिकेट शामिल नहीं है) है।

यहां मल्टीसेट्स के लिए एक कार्यान्वयन है: https://github.com/mlenzen/collections-extended (पायपी का collections extended मॉड्यूल)।

मल्टीसेट के लिए डेटा संरचना bag कहा जाता है। bag मॉड्यूल से Set कक्षा का उप-वर्ग है जो तत्वों की गुणों का ट्रैक रखने के लिए एक अतिरिक्त शब्दकोश के साथ है।

class _basebag(Set): 
    """ 
    Base class for bag and frozenbag. Is not mutable and not hashable, so there's 
    no reason to use this instead of either bag or frozenbag. 
    """ 
    # Basic object methods 

    def __init__(self, iterable=None): 
     """Create a new basebag. 

     If iterable isn't given, is None or is empty then the bag starts empty. 
     Otherwise each element from iterable will be added to the bag 
     however many times it appears. 

     This runs in O(len(iterable)) 
     """ 
     self._dict = dict() 
     self._size = 0 
     if iterable: 
      if isinstance(iterable, _basebag): 
       for elem, count in iterable._dict.items(): 
        self._inc(elem, count) 
      else: 
       for value in iterable: 
        self._inc(value) 

bag के लिए एक अच्छा विधि nlargest (सूचियों के लिए Counter के समान) है, कि blazingly तेजी से सभी तत्वों के multiplicities रिटर्न के बाद से प्रत्येक तत्व की घटनाओं की संख्या बैग के शब्दकोश में अप करने की तारीख रखा जाता है :

>>> b=bag(random.choice(string.ascii_letters) for x in xrange(10)) 
>>> b.nlargest() 
[('p', 2), ('A', 1), ('d', 1), ('m', 1), ('J', 1), ('M', 1), ('l', 1), ('n', 1), ('W', 1)] 
>>> Counter(b) 
Counter({'p': 2, 'A': 1, 'd': 1, 'm': 1, 'J': 1, 'M': 1, 'l': 1, 'n': 1, 'W': 1}) 
संबंधित मुद्दे