2010-11-12 16 views
12

के साथ ऑब्जेक्ट की सूची में डुप्लिकेट निकालें मुझे ऑब्जेक्ट्स की एक सूची मिली है और मुझे रिकॉर्ड से भरा एक डीबी टेबल मिला है। ऑब्जेक्ट्स की मेरी सूची में एक शीर्षक विशेषता है और मैं सूची से डुप्लिकेट शीर्षक (मूल छोड़कर) के साथ किसी ऑब्जेक्ट को हटाना चाहता हूं।पाइथन

तो मैं अगर वस्तुओं की सूची को डेटाबेस में और यदि ऐसा है तो किसी भी रिकॉर्ड से कुछ डुप्लीकेट की जांच करने, उन्हें डेटाबेस में जोड़ने से पहले सूची से उन वस्तुओं को दूर करना चाहते हैं।

मैंने इस तरह की सूची से डुप्लीकेट हटाने के लिए समाधान देखा है: myList = list(set(myList)), लेकिन मुझे यकीन नहीं है कि वस्तुओं की सूची के साथ ऐसा कैसे करें?

मुझे वस्तुओं की मेरी सूची का क्रम भी बनाए रखने की आवश्यकता है। मैं यह भी सोच रहा था कि मैं शीर्षक में मतभेदों की जांच के लिए difflib का उपयोग कर सकता हूं।

+4

चरण 1. खोजें। यह सटीक शब्द पाइथन प्रोग्रामिंग कक्षा में प्रत्येक सेमेस्टर का उपयोग किया जाता है। कृपया खोजें –

+0

__ मूल__ को छोड़कर, इसका क्या अर्थ है? क्योंकि अगर आपने कहा कि आप सूची के ऑर्डर__ को __maintain करना चाहते हैं तो सूची में डुप्लिकेट ऑब्जेक्ट की पहली घटना मूल अधिकार होगी? – mouad

+0

हाँ, मेरा मतलब है कि मैं मूल को छोड़कर सभी डुप्लिकेट को हटाना चाहता हूं। @ एसएलॉट, मैंने एक टन खोजा और मुझे कुछ भी नहीं मिला, इसलिए मैं यहां आया था। क्या आप एक उदाहरण उद्धृत कर सकते हैं जो इस सटीक समस्या का समाधान करे? मुझे यह देखकर खुशी होगी। – imns

उत्तर

28

set(list_of_objects) केवल डुप्लिकेट निकाल देंगे, कि है, आप एक वस्तु की एक विशिष्टता को परिभाषित करने की आवश्यकता होगी।

ऐसा करने के लिए, आपको ऑब्जेक्ट को हर्षनीय बनाने की आवश्यकता होगी। आप दोनों __hash__ और __eq__ विधि परिभाषित करने की जरूरत है, तो यहां है:

http://docs.python.org/glossary.html#term-hashable

हालांकि, तो आप शायद ही __eq__ विधि को परिभाषित करने की आवश्यकता होगी।

संपादित: __eq__ विधि लागू करना सीखें:

आप जानते हैं, करना होगा, जैसा मैंने कहा, अपने वस्तु की विशिष्टता परिभाषा। मान लीजिए कि हमारे पास विशेषता लेखक_नाम और शीर्षक है जिसमें उनका संयोजन अद्वितीय है, (इसलिए, हमारे पास स्टीफन किंग की कई किताबें हो सकती हैं, और द शाइनिंग नाम की कई किताबें हो सकती हैं, लेकिन स्टीफन किंग द्वारा द शाइनिंग नामक केवल एक पुस्तक), फिर कार्यान्वयन इस प्रकार है:

def __eq__(self, other): 
    return self.author_name==other.author_name\ 
      and self.title==other.title 

इसी तरह, यह मैं कभी कभी कैसे लागू __hash__ विधि है:

def __hash__(self): 
    return hash(('title', self.title, 
       'author_name', self.author_name)) 

आप देख सकते हैं कि आप एक ही लेखक और शीर्षक, किताब के साथ 2 पुस्तकों की एक सूची बनाते हैं ऑब्जेक्ट्स वही होंगे (is ऑपरेटर के साथ) और बराबर (== ऑपरेटर के साथ)। साथ ही, जब set() का उपयोग किया जाता है, तो यह एक पुस्तक को हटा देगा।

संपादित: यह मेरा एक वर्ष anwser है, लेकिन मैं केवल अब नोटिस यह त्रुटि जो पिछले पैराग्राफ में स्ट्राइकथ्रू के साथ ठीक किया जाता है कि: एक ही hash() साथ वस्तुओं True नहीं देंगे जब is के साथ तुलना में । ऑब्जेक्ट की हैशबिलिटी का उपयोग किया जाता है, हालांकि, यदि आप सेट के तत्वों के रूप में या शब्दकोश में कुंजी के रूप में उनका उपयोग करना चाहते हैं।

+0

अच्छा, मुझे '__hash__' और' __eq__' के बारे में पता नहीं था। '__eq__' को कार्यान्वित करने के तरीके पर कोई उदाहरण? – imns

+0

ऊपर दिए गए संपादन को देखें – vonPetrushev

6

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

यहां पहला भाग है।

seen_titles = set() 
new_list = [] 
for obj in myList: 
    if obj.title not in seen_titles: 
     new_list.append(obj) 
     seen_titles.add(obj.title) 

आप क्या डेटाबेस/ORM आदि आप हालांकि दूसरे भाग के लिए उपयोग कर रहे हैं का वर्णन करने की जरूरत जा रहे हैं।

+0

मैं sqlobject के साथ mysql का उपयोग कर रहा हूँ। – imns

+0

@bababa कृपया प्रश्न को अपडेट करें ताकि अन्य लोग इसे भी देखें। – aaronasterling

+0

@ बाबाबा, मुझे sqlobject (यानी एक प्रश्न में डीबी से प्रत्येक वस्तु को खींचने या प्रति वस्तु एक प्रश्न बनाने के बिना) करने के लिए ऐसा करने का एक अच्छा तरीका नहीं दिखता है, इसलिए मैं थोड़ी देर इंतजार करूँगा और फिर पोस्ट करूंगा कि अगर कोई sqlobject से बेहतर नहीं जानता है कि मैं साथ नहीं आता है। – aaronasterling

1

यह सुंदर न्यूनतम लगता है: यदि आप जानते हैं कि डुप्लिकेट है

new_dict = dict() 
for obj in myList: 
    if obj.title not in new_dict: 
     new_dict[obj.title] = obj 
0

इसकी काफी आसान freinds: -

एक = [5,6,7,32,32,32,32,32,32,32,32]

एक = सूची (सेट (क))

प्रिंट (एक)

[5,6,7,32] 

यह है कि! :)

+5

ऑब्जेक्ट वाली सूची में ऐसा नहीं कर सकता है। –

0

आप संरक्षित करना चाहते हैं मूल आदेश में इसका इस्तेमाल:

seen = {} 
new_list = [seen.setdefault(x, x) for x in my_list if x not in seen] 

आप तो आदेश देने के लिए इसका इस्तेमाल की परवाह नहीं है, तो:

new_list = list(set(my_list))