2013-06-27 9 views
11

के साथ ऑब्जेक्ट्स की सूची मेरे पास ऑब्जेक्ट्स की एक सूची है जिसमें प्रत्येक के पास एक विशिष्ट विशेषता है। वह विशेषता अद्वितीय नहीं है, और मैं उन ऑब्जेक्ट्स की एक सूची के साथ समाप्त करना चाहूंगा जो संपूर्ण सूची का सबसेट है जैसे कि सभी विशिष्ट विशेषताओं एक अद्वितीय सेट है।एक अद्वितीय विशेषता

उदाहरण के लिए

, अगर मैं चार वस्तुओं है:

object1.thing = 1 
object2.thing = 2 
object3.thing = 3 
object4.thing = 2 

मैं के साथ समाप्त करने के लिए चाहते हो जाएगा या तो

[object1, object2, object3] 

या

[object1, object3, object4] 

सटीक ऑब्जेक्ट में हवा अंतिम सूची महत्वपूर्ण नहीं है, केवल उनकी विशिष्ट विशेषता की एक सूची अद्वितीय है।

संपादित करें: स्पष्ट रूप से, जो मैं चाहता हूं वह एक सेट है जो उस विशिष्ट विशेषता से बाहर है।

+1

की संभावित डुप्लिकेट [कैसे एक कुंजी शब्द का उपयोग कर अद्वितीय सूची प्राप्त करने: अजगर ] (https://stackoverflow.com/questions/10024646/how-to-get-unique-list-using-a-key-word-python) – Georgy

उत्तर

12

आप एक ऐसा नियम बना सकते हैं जिसकी कुंजी वस्तु की बात है और मूल्य वस्तुएं स्वयं हैं।

d = {} 
for obj in object_list: 
    d[obj.thing] = obj 
desired_list = d.values() 
+7

छोटा: ओबीजे के लिए 'dict ((obj.thing, obj) object_list) .values ​​() '। –

+0

मुझे निश्चित रूप से यह पसंद है लेकिन मुझे हमेशा समझ में कठिनाई होती है, और मैं यह स्पष्ट करना चाहता था कि मैं क्या कर रहा था। – Brien

+2

पायथन 3 इसे सुंदर बनाता है: '{obj.thing: obj for object_list} में obj '(लेकिन' मानों से एक सूची नहीं, एक सूची देता है)। –

14

आप उपयोग कर सकते हैं एक list comprehension और set:

objects = (object1,object2,object3,object4) 
seen = set() 
unique = [obj for obj in objects if obj.thing not in seen and not seen.add(obj.thing)] 

ऊपर कोड के बराबर है:

seen = set() 
unique = [] 
for obj in objects: 
    if obj.thing not in seen: 
     unique.append(obj) 
     seen.add(obj.thing) 
+0

उपरोक्त क्योंकि सेट डिक्ट्स से बेहतर कार्य को व्यक्त करते हैं। दोनों "हैशबल" ऑब्जेक्ट के पायथन की धारणा का उपयोग करते हैं और इस प्रकार कार्यात्मक रूप से समकक्ष होते हैं। लेकिन अगर मैं आपका कोड पढ़ रहा हूं, तो सेट मुझे बताता है कि "वह चीजों की एक अनोखी सूची चाहता है" जबकि निर्देश मुझे बताता है कि "उसे डेटा मैप करने की जरूरत है", जो इस मामले में भ्रामक है। – Dave

+5

यह एक अच्छा समाधान है, लेकिन कोड दोनों पाइथन 2 और 3. अद्वितीय = [ऑब्जेक्ट में obj के लिए obj.thing obj.thing में नहीं देखा गया है और देखा नहीं है .add (obj.thing)] सही वाक्यविन्यास है – GDR

संबंधित मुद्दे