इस उत्तर में, दो खंड होंगे: दो अद्वितीय समाधान, और विशिष्ट समाधानों के लिए गति का एक ग्राफ।
डुप्लिकेट आइटम निकाल रहा है
इनमें से अधिकांश उत्तर केवल डुप्लिकेट आइटमों को हटाते हैं जो कि धोए जा सकने वाले आइटम हैं , लेकिन यह प्रश्न स्पष्ट नहीं है कि इसे केवल धोने योग्य वस्तुओं की आवश्यकता नहीं है , जिसका अर्थ है कि मैं कुछ समाधानों की पेशकश करूंगा, जिन्हें धोने योग्य वस्तुओं की आवश्यकता नहीं है ।
collection.Counter मानक पुस्तकालय में एक शक्तिशाली उपकरण है जो इसके लिए एकदम सही हो सकता है। केवल एक अन्य समाधान है जिसमें काउंटर भी है। हालाँकि, यह समाधान भी हैज़िकल कीज़ तक सीमित है ।
काउंटर में अस्वास्थ्यकर कुंजियों की अनुमति देने के लिए, मैंने एक कंटेनर क्लास बनाया, जो ऑब्जेक्ट के डिफ़ॉल्ट हैश फ़ंक्शन को प्राप्त करने का प्रयास करेगा, लेकिन यदि यह विफल हो जाता है, तो यह इसके पहचान फ़ंक्शन को आज़माएगा। यह एक eq और हैश विधि को भी परिभाषित करता है । यह हमारे समाधान में उपलब्ध वस्तुओं को अनुमति देने के लिए पर्याप्त होना चाहिए । धोने योग्य वस्तुओं का उपचार किया जाएगा जैसे कि वे धोने योग्य हों। हालांकि, यह हैश फ़ंक्शन अस्वास्थ्यकर वस्तुओं के लिए पहचान का उपयोग करता है, जिसका अर्थ है कि दो समान ऑब्जेक्ट जो दोनों उपलब्ध नहीं हैं, काम नहीं करेंगे। मेरा सुझाव है कि आप इसे ओवरराइड कर रहे हैं, और इसे बराबर म्यूटेबल प्रकार के हैश का उपयोग करने के लिए बदल रहे हैं (जैसे hash(tuple(my_list))
यदि उपयोग कर रहे हैंmy_list
एक सूची है )।
मैंने भी दो उपाय किए। एक और समाधान जो ऑर्डरडीडिक्ट और काउंटर दोनों के उपवर्ग का उपयोग करके वस्तुओं के ऑर्डर को रखता है, जिसे 'ऑर्डरेडकाउंटर' नाम दिया गया है। अब, यहाँ कार्य हैं:
from collections import OrderedDict, Counter
class Container:
def __init__(self, obj):
self.obj = obj
def __eq__(self, obj):
return self.obj == obj
def __hash__(self):
try:
return hash(self.obj)
except:
return id(self.obj)
class OrderedCounter(Counter, OrderedDict):
'Counter that remembers the order elements are first encountered'
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))
def __reduce__(self):
return self.__class__, (OrderedDict(self),)
def remd(sequence):
cnt = Counter()
for x in sequence:
cnt[Container(x)] += 1
return [item.obj for item in cnt]
def oremd(sequence):
cnt = OrderedCounter()
for x in sequence:
cnt[Container(x)] += 1
return [item.obj for item in cnt]
रीमेड नॉन-ऑर्डर सॉर्टिंग है, ऑर्मर्ड को क्रमबद्ध करने का आदेश दिया गया है। आप स्पष्ट रूप से बता सकते हैं कि कौन सा तेज है, लेकिन मैं किसी भी तरह समझाऊंगा। गैर-क्रमबद्ध छंटाई थोड़ी तेज है। यह कम डेटा रखता है, क्योंकि इसे ऑर्डर की आवश्यकता नहीं है।
अब, मैं भी प्रत्येक उत्तर की गति तुलना दिखाना चाहता था। तो, मैं अभी करूँगा।
कौन सा फ़ंक्शन सबसे तेज़ है?
डुप्लिकेट को निकालने के लिए, मैंने कुछ उत्तरों से 10 फ़ंक्शन एकत्र किए। मैंने प्रत्येक फ़ंक्शन की गति की गणना की और इसे matplotlib.pyplot का उपयोग करके एक ग्राफ में डाला ।
मैंने इसे ग्राफिंग के तीन राउंड में विभाजित किया। एक धोने योग्य कोई भी वस्तु है, जिसे हैश किया जा सकता है, एक धोने योग्य कोई भी वस्तु है जिसे हैशेड नहीं किया जा सकता है। एक क्रमबद्ध अनुक्रम वह अनुक्रम है जो आदेश को संरक्षित करता है, एक अनियोजित अनुक्रम आदेश को संरक्षित नहीं करता है। अब, यहां कुछ और शब्द दिए गए हैं:
अक्रमित Hashable कोई भी तरीका जो डुप्लिकेट है, जो जरूरी आदेश रखने के लिए नहीं था हटा दिया था। इसमें अस्वस्थता के लिए काम नहीं करना था, लेकिन यह हो सकता है।
आदेश दिया Hashable किसी भी विधि है जो सूची में आइटम्स के आदेश रखा के लिए था, लेकिन यह unhashables के लिए काम करने के लिए नहीं था, लेकिन यह कर सकते थे।
अनहद का आदेश दिया कोई भी तरीका है जो सूची में वस्तुओं के क्रम को बनाए रखता है, और अनहैबल्स के लिए काम करता है।
Y- अक्ष पर सेकंड की मात्रा है।
X- अक्ष पर वह संख्या है जिस पर फ़ंक्शन को लागू किया गया था।
हमने असमान हैशबल्स के लिए अनुक्रम उत्पन्न किए और निम्नलिखित समझ के साथ हैशबल्स का आदेश दिया: [list(range(x)) + list(range(x)) for x in range(0, 1000, 10)]
आदेशित अस्वस्थ के लिए: [[list(range(y)) + list(range(y)) for y in range(x)] for x in range(0, 1000, 10)]
ध्यान दें कि रेंज में एक 'स्टेप' है क्योंकि इसके बिना, यह तब तक 10x हो जाता है। अपने व्यक्तिगत विचार के कारण, मुझे लगा कि यह पढ़ने में थोड़ा आसान लग रहा है।
इस बात पर भी ध्यान दें कि किंवदंती क्या हैं, मैंने फ़ंक्शन के सबसे महत्वपूर्ण भागों के रूप में अनुमान लगाने की कोशिश की है। क्या कार्य सबसे खराब या सबसे अच्छा है? ग्राफ अपने लिए बोलता है।
उस बसे के साथ, यहाँ रेखांकन हैं।
अनियंत्रित हैशबल्स
(ज़ूम इन)
हशबेल को आदेश दिया
(ज़ूम इन)
अनहैबल्स का आदेश दिया
(ज़ूम इन)