कई उपयोग मामलों के लिए, आपको जो उत्तर चाहिए वह है:
ys = set(y)
[item for item in x if item not in ys]
यह एरोनस्टरलिंग के उत्तर और क्वांटमसाउप के उत्तर के बीच एक संकर है ।
aaronasterling का संस्करण len(y)
प्रत्येक तत्व के लिए आइटम की तुलना करता है x
, इसलिए इसमें द्विघात समय लगता है। quantumSoup का संस्करण सेट का उपयोग करता है, इसलिए यह प्रत्येक तत्व के लिए एक निरंतर-समय सेट लुकअप करता है x
- क्योंकि यह दोनों को x
और y
सेट में परिवर्तित करता है, यह आपके तत्वों का क्रम खो देता है।
केवल y
एक सेट में परिवर्तित करके , और x
क्रम में पुनरावृत्ति करके, आप दोनों दुनियाओं में से सबसे अच्छा प्राप्त करते हैं - रैखिक समय, और आदेश संरक्षण *।
हालाँकि, यह अभी भी क्वांटमसाउप के संस्करण से एक समस्या है: इसके लिए आपके तत्वों को धोने योग्य होना चाहिए। यह सेटों की प्रकृति में बहुत अधिक निर्मित है। ** यदि आप कोशिश कर रहे हैं, जैसे, किसी अन्य सूची के डिट्स की सूची को घटाएं, लेकिन घटाने की सूची बड़ी है, तो आप क्या करते हैं?
यदि आप अपने मूल्यों को किसी तरह से सजा सकते हैं, तो वे धोने योग्य हैं, जो समस्या को हल करता है। उदाहरण के लिए, एक सपाट शब्दकोष के साथ, जिसके मूल्य स्वयं ही धोने योग्य हैं:
ys = {tuple(item.items()) for item in y}
[item for item in x if tuple(item.items()) not in ys]
यदि आपके प्रकार थोड़े अधिक जटिल हैं (उदाहरण के लिए, अक्सर आप JSON- संगत मानों के साथ काम कर रहे हैं, जो धोने योग्य हैं, या सूचियाँ या dicts जिनके मान एक ही प्रकार के हैं), तो भी आप इस समाधान का उपयोग कर सकते हैं। लेकिन कुछ प्रकारों को केवल कुछ हैशेबल में परिवर्तित नहीं किया जा सकता है।
यदि आपके आइटम नहीं हैं, और बनाया नहीं जा सकता है, धो सकते हैं, लेकिन वे तुलनीय हैं, तो आप कम से कम लॉग-रैखिक समय प्राप्त कर सकते हैं ( O(N*log M)
, जो O(N*M)
सूची समाधान के समय की तुलना में बहुत बेहतर है , लेकिन उतना अच्छा नहीं है O(N+M)
सेट समाधान का समय) छाँटकर और इस्तेमाल करके bisect
:
ys = sorted(y)
def bisect_contains(seq, item):
index = bisect.bisect(seq, item)
return index < len(seq) and seq[index] == item
[item for item in x if bisect_contains(ys, item)]
यदि आपके आइटम न तो धोने योग्य हैं और न ही तुलनीय हैं, तो आप द्विघात समाधान के साथ फंस गए हैं।
* ध्यान दें कि आप एक जोड़ी OrderedSet
वस्तुओं का उपयोग करके भी ऐसा कर सकते हैं, जिसके लिए आप व्यंजनों और तीसरे पक्ष के मॉड्यूल पा सकते हैं। लेकिन मुझे लगता है कि यह सरल है।
** कारण सेट लुकअप लगातार समय है कि यह सब करना है hash मूल्य है और देखें कि क्या वहाँ हैश के लिए एक प्रविष्टि है। यदि यह मान नहीं है, यह काम नहीं करेगा।