ऐसा लगता है कि ओपी केवल दो चर के मामले से संबंधित था, लेकिन चूंकि स्टैकऑवरफ्लो उन लोगों के लिए भी है जो बाद में एक ही प्रश्न की खोज करते हैं, इसलिए मैं यहां कुछ विस्तार से सामान्य मामले से निपटने की कोशिश करूंगा; एक पिछले उत्तर में पहले से ही एक जेनेरिक उत्तर का उपयोग किया गया है itertools.permutations()
, लेकिन यह विधि O(N*N!)
तुलना की ओर ले जाती है , क्योंकि प्रत्येक आइटम के N!
साथ क्रमपरिवर्तन N
होते हैं। (इस उत्तर के लिए यह मुख्य प्रेरणा थी)
पहले, आइए संक्षेप में बताएं कि पिछले उत्तरों में से कुछ तरीके जेनेरिक मामले पर कैसे लागू होते हैं, क्योंकि यहां प्रस्तुत विधि के लिए प्रेरणा है। मैं का उपयोग किया जाएगा A
उल्लेख करने के लिए (x, y)
और B
का उल्लेख करने (a, b)
, मनमाने ढंग से (लेकिन समान) लंबाई की tuples हो सकता है।
set(A) == set(B)
तेजी से होता है, लेकिन केवल तभी काम करता है यदि मान उपलब्ध नहीं होते हैं और आप यह गारंटी दे सकते हैं कि ट्यूपल्स में से कोई भी डुप्लिकेट मान नहीं रखता है। (जैसे। {1, 1, 2} == {1, 2, 2}
@Daniel Mesejo के जवाब के तहत @ user2357112 द्वारा बताया गया)
पिछली पद्धति को डुप्लिकेट मानों के साथ काम करने के लिए सेट के बजाय, के साथ शब्दकोशों का उपयोग करके बढ़ाया जा सकता है: (यह अभी भी सीमा है कि सभी मूल्यों को धोने योग्य होने की आवश्यकता है, इसलिए जैसे। परिवर्तनशील मान list
काम नहीं करेंगे)
def counts(items):
d = {}
for item in items:
d[item] = d.get(item, 0) + 1
return d
counts(A) == counts(B)
sorted(A) == sorted(B)
धोने योग्य मूल्यों की आवश्यकता नहीं है, लेकिन थोड़ा धीमा है, और इसके बजाय क्रमबद्ध मूल्यों की आवश्यकता है। (इसलिए जैसे complex
काम नहीं करेगा)
A in itertools.permutations(B)
हैशेबल या ऑर्डर करने योग्य मूल्यों की आवश्यकता नहीं होती है, लेकिन जैसा कि पहले ही उल्लेख किया गया है, इसमें O(N*N!)
जटिलता है, इसलिए केवल 11 वस्तुओं के साथ, इसे खत्म होने में एक सेकंड लग सकता है।
तो, क्या सामान्य होने का एक तरीका है, लेकिन क्या यह काफी तेज है? क्यों हाँ, "मैन्युअल रूप से" जाँच करके कि प्रत्येक आइटम की समान मात्रा है: (इस एक की जटिलता है O(N^2)
, इसलिए यह बड़े इनपुट के लिए अच्छा नहीं है; मेरी मशीन पर, 10k आइटम एक सेकंड से अधिक ले सकते हैं - लेकिन साथ छोटे इनपुट, जैसे 10 आइटम, यह दूसरों की तरह ही तेज है)
def unordered_eq(A, B):
for a in A:
if A.count(a) != B.count(a):
return False
return True
सर्वश्रेष्ठ प्रदर्शन प्राप्त करने के लिए, कोई व्यक्ति dict
पहले sorted
से संचालित पद्धति को आजमाना चाहता है, -बेड विधि पर वापस आ सकता है, यदि वह मानों के कारण विफल हो जाती है, और अंत में -बेड count
विधि में वापस गिर जाती है, यदि वह भी असंगत मूल्यों के कारण विफल हो जाती है।
x,y, a,b
हैं: वे ints / floats / strings, मनमानी वस्तुएं, या क्या हैं? अगर वे प्रकार निर्मित थे और यह संभव हो गया था दोनों रखने के लिएx,y
औरa,b
क्रमबद्ध क्रम में है, तो आप दूसरे शाखा से बच सकते हैं। ध्यान दें कि एक सेट बनाने से चार तत्वों मेंx,y, a,b
से प्रत्येक को हैशेड किया जाएगा, जो कि तुच्छ नहीं हो सकता है या एक प्रदर्शन निहितार्थ हो सकता है कि वे किस प्रकार की वस्तुओं पर पूरी तरह से निर्भर करते हैं।