2010-04-01 21 views
14

मेरे पास पाइथन में ऑब्जेक्ट्स की एक सूची है। तब मेरे पास वस्तुओं की एक और सूची है। मैं पहली सूची में जाना चाहता हूं और देख सकता हूं कि दूसरी सूची में कोई आइटम दिखाई देता है या नहीं।पाइथन जांच करें कि वस्तु ऑब्जेक्ट्स की सूची में है

मैंने सोचा कि मैं बस

for item1 in list1: 
    for item2 in list2: 
     if item1 == item2: 
      print "item %s in both lists" 

कर सकता है लेकिन इस काम करने के लिए प्रतीत नहीं होता। हालांकि अगर मैं करता हूं:

if item1.title == item2.title: 

यह ठीक काम करता है। मेरे पास इसके मुकाबले ज्यादा गुण हैं, हालांकि अगर मुझे ऐसा नहीं करना है तो सभी विशेषताओं की तुलना में कथन अगर वास्तव में 1 बड़ा करना नहीं चाहता है।

क्या कोई मुझे सहायता दे सकता है या सलाह दे सकता है कि मैं दोनों सूचियों में दिखाई देने वाली वस्तुओं को ढूंढने के लिए क्या कर सकता हूं।

धन्यवाद

उत्तर

24

मान लिया जाये कि आपके वस्तु केवल एक title विशेषता है जो समानता के लिए प्रासंगिक है है तो आप उसे __eq__ विधि लागू करने के लिए इस प्रकार है:

class YourObject: 
    [...] 
    def __eq__(self, other): 
     return self.title == other.title 
बेशक

यदि आप और अधिक विशेषताओं है कि समानता के लिए प्रासंगिक हैं है, तो आप उनको भी शामिल करना चाहिए। आप लगातार व्यवहार के लिए __ne__ और __cmp__ को लागू करने पर भी विचार कर सकते हैं।

5

set intersection उस के लिए क्या करेंगे।

>>> x=[1,2,3,4] 
>>> y=[3,4,5,6] 
>>> for i in set(x) & set(y): 
...  print "item %d in both lists" %i 
... 
item 3 in both lists 
item 4 in both lists 
+3

मुझे लगता है कि उनकी समस्या वस्तु समानता है, इतना खोज नहीं है :) – extraneon

+3

ओपी में वस्तुओं की सूचियां हैं, परमाणु प्रकार की सूचियां नहीं हैं। यदि आप उन ऑब्जेक्ट्स के साथ अपना कोड आज़माते हैं जिनके पास '__hash__' परिभाषित नहीं है, तो यह काम नहीं करेगा, जैसे ओपी का कोड ऑब्जेक्ट्स की सूचियों के साथ काम नहीं करता है जिसके लिए कोई '__eq__' या' __cmp__' परिभाषित नहीं है। – hughdbrown

9

मामले में वस्तुओं नहीं एक ही उदाहरण के लिए, आप अजगर को बताने के लिए जब 2 वस्तुओं वास्तव में बराबर हैं सक्षम होने के लिए के लिए __eq__ विधि लागू करने की आवश्यकता है।

बेशक अधिकांश लाइब्रेरी प्रकार, जैसे स्ट्रिंग्स और सूचियों में पहले से ही __eq__ लागू है, जो आपके लिए शीर्षक कामों की तुलना करने का कारण हो सकता है (क्या वे तार हैं?)।

अधिक जानकारी के लिए python documentation देखें।
__eq__ के लिए यहां random example है।

+0

हाँ वे एक ही उदाहरण नहीं हैं। क्या आप मुझे __eq__ फ़ंक्शन का उदाहरण दे सकते हैं क्योंकि मैं पाइथन – John

+0

@ जॉन के लिए बिल्कुल नया हूं - मैंने एक उदाहरण के लिए एक लिंक जोड़ा है। बस "def __eq__" के लिए Google कोड खोज को खोजना मेरे लिए हल किया गया है :) – abyx

4

ढूँढना वस्तुओं जो दोनों सूचियों में दिखाई देते हैं:

l1 = [1,2,3,4,5] 
l2 = [3,4,5] 
common = set(l1).intersection(set(l2)) 

वस्तु पर __eq__ कार्यान्वयन के साथ इस कम्बाइन के रूप में दूसरों का सुझाव दिया।

0

निम्नलिखित का प्रयास करें:

list1 = [item1, item2, item3] 
list2 = [item3, item4, item5] 
for item in list1: 
    if item in list2: 
     print "item %s in both lists" % item 
2
matches = [x for x in listA if x in listB] 
+0

जब तक कि मैं गलत तरीके से काम करता हूं कि कैसे 'इन' काम करता है, इसके लिए रनटाइम सूची की लंबाई का उत्पाद होगा, जो खराब हो सकता है। – shabbychef

3

आप समानता के लिए वस्तुओं की तुलना करने के लिए कैसे परिभाषित करने के लिए एक __eq__ समारोह लिखने के लिए की जरूरत है। यदि आप सॉर्ट करना चाहते हैं, तो आपके पास __cmp__ फ़ंक्शन होना चाहिए, और __cmp__ के संदर्भ में __eq__ को लागू करने का सबसे अधिक अर्थ है।

def __eq__(self, other): 
    return cmp(self, other) == 0 

आप शायद भी __hash__ को लागू करना चाहिए, और आप निश्चित रूप से आप एक सेट या शब्दकोश में अपनी वस्तुओं डाल करने के लिए योजना बनानी चाहिए अगर।ऑब्जेक्ट्स के लिए डिफ़ॉल्ट __hash__ आईडी() है, जो प्रभावी रूप से सभी ऑब्जेक्ट्स अद्वितीय बनाता है (यानी विशिष्टता ऑब्जेक्ट सामग्री पर आधारित नहीं है)।

मैंने कक्षा के लिए बेस क्लास/इंटरफ़ेस लिखा है जो इस प्रकार की समानता तुलना करता है। आप इसे उपयोगी पाते हो सकता है:

class Comparable(object): 
    def attrs(self): 
     raise Exception("Must be implemented in concrete sub-class!") 
    def __values(self): 
     return (getattr(self, attr) for attr in self.attrs()) 
    def __hash__(self): 
     return reduce(lambda x, y: 37 * x + hash(y), self.__values(), 0) 
    def __cmp__(self, other): 
     for s, o in zip(self.__values(), other.__values()): 
      c = cmp(s, o) 
      if c: 
       return c 
     return 0 
    def __eq__(self, other): 
     return cmp(self, other) == 0 
    def __lt__(self, other): 
     return cmp(self, other) < 0 
    def __gt__(self, other): 
     return cmp(self, other) > 0 

if __name__ == '__main__': 
    class Foo(Comparable): 
     def __init__(self, x, y): 
      self.x = x 
      self.y = y 
     def attrs(self): 
      return ('x', 'y') 
     def __str__(self): 
      return "Foo[%d,%d]" % (self.x, self.y) 

    def foo_iter(x): 
     for i in range(x): 
      for j in range(x): 
       yield Foo(i, j) 

    for a in foo_iter(4): 
     for b in foo_iter(4): 
      if a<b: print "%(a)s < %(b)s" % locals() 
      if a==b: print "%(a)s == %(b)s" % locals() 
      if a>b: print "%(a)s > %(b)s" % locals() 

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

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