निर्धारित करें यदि 2 सूचियों आदेश की परवाह किए बिना, एक ही तत्व है?
अपने उदाहरण से निष्कर्ष निकालते:
x = ['a', 'b']
y = ['b', 'a']
कि सूचियों के तत्वों को दोहराया नहीं किए जाएंगे (उन्हें अद्वितीय हैं) और साथ ही hashable (जो तार और अन्य कुछ अपरिवर्तनीय अजगर वस्तुओं रहे हैं) , सबसे प्रत्यक्ष और कम्प्यूटेशनल रूप से कुशल उत्तर पायथन के बिल्टिन सेट का उपयोग करता है, (जो कि सैद्धांतिक रूप से गणितीय सेटों की तरह हैं जिन्हें आपने स्कूल में सीखा होगा)।
set(x) == set(y) # prefer this if elements are hashable
मामले है कि तत्वों hashable हैं, लेकिन गैर-अद्वितीय, collections.Counter
भी एक मल्टीसेट के रूप में अर्थ की दृष्टि से काम करता है, लेकिन यह कहीं धीमी है:
from collections import Counter
Counter(x) == Counter(y)
sorted
उपयोग करने के लिए पसंद करते हैं:
sorted(x) == sorted(y)
यदि तत्व ऑर्डर करने योग्य हैं। यह गैर-अद्वितीय या गैर-हानिकारक परिस्थितियों के लिए जिम्मेदार होगा, लेकिन यह सेट का उपयोग करने से बहुत धीमा हो सकता है।
अनुभवजन्य प्रयोग
एक अनुभवजन्य प्रयोग का निष्कर्ष है कि एक set
को प्राथमिकता देनी चाहिए, तो sorted
। केवल Counter
का चयन करें यदि आपको मल्टीसेट के रूप में अन्य चीजों की गणना या आगे उपयोग की आवश्यकता है।
पहले स्थापना:
import timeit
import random
from collections import Counter
data = [str(random.randint(0, 100000)) for i in xrange(100)]
data2 = data[:] # copy the list into a new one
def sets_equal():
return set(data) == set(data2)
def counters_equal():
return Counter(data) == Counter(data2)
def sorted_lists_equal():
return sorted(data) == sorted(data2)
और परीक्षण:
>>> min(timeit.repeat(sets_equal))
13.976069927215576
>>> min(timeit.repeat(counters_equal))
73.17287588119507
>>> min(timeit.repeat(sorted_lists_equal))
36.177085876464844
तो हम देखते हैं कि सेट की तुलना में सबसे तेजी से समाधान है, और हल कर सूचियों की तुलना दूसरी सबसे तेज है।
कोई आश्चर्य नहीं होना चाहिए क्योंकि आपकी विधि ओ (एन^2) है, जो ओ (एन) या ओ (एन * लॉग एन) से काफी बड़ी है। बी (एन तत्व) के प्रत्येक तत्व के लिए यह ए (एन तत्वों) के सभी तत्वों की जांच कर रहा है। चेक की संख्या तब एन * एन है। – RobMcZag