2016-02-29 3 views
6

मैं पायथन में नया हूं। मैं पायथन v2.7 का उपयोग कर रहा हूँ।जांचें कि कोई ऑब्जेक्ट (कुछ गुण मानों के साथ) सूची में नहीं है

मैं एक साधारण वर्ग Product परिभाषित किया है: तो फिर

class Product: 
    def __init__(self, price, height, width): 
     self.price = price 
     self.height = height 
     self.width = width 

, मैं एक सूची है, जो तब एक Product वस्तु के साथ जोड़ दिया जाता है बनाया:

# empty list 
prod_list = [] 
# append a product to the list, all properties have value 3 
prod1 = Product(3,3,3) 
prod_list.append(prod1) 

फिर, मैं एक और Product वस्तु बनाया जो समान प्रारंभिक मान सेट करें (सभी 3):

prod2 = Product(3,3,3) 
मैं उम्मीद कोई प्रिंट संदेश बाहर वहाँ है,

if prod2 not in prod_list: 
    print("no product in list has price=3, width=3 & height=3") 

:

फिर, मैं अगर prod_list एक Product वस्तु है कि मूल्य = 3, चौड़ाई = 3 & ऊंचाई = 3 शामिल नहीं है जाँच करना चाहते हैं द्वारा, लेकिन यह मुद्रित है। पायथन में, मैं कैसे जांच सकता हूं कि किसी सूची में कुछ संपत्ति मूल्यों के साथ कोई ऑब्जेक्ट नहीं है या नहीं?

उत्तर

7

आपको अपनी ऑब्जेक्ट में equality विशेषता जोड़ने की आवश्यकता है। ऑब्जेक्ट गुण प्राप्त करने के लिए आप विशेषता नाम को operator.attrgetter पर पास कर सकते हैं जो प्राप्त गुणों का एक टुपल देता है तो आप tuples की तुलना कर सकते हैं। इसके अलावा आप __dict__ विशेषता का उपयोग कर सकते हैं जो आपको मॉड्यूल के नामस्थान को एक शब्दकोश वस्तु के रूप में देगा। फिर आप उन गुणों के नाम प्राप्त कर सकते हैं जिन्हें आप उनके आधार पर वस्तुओं की तुलना करना चाहते हैं।

from operator import attrgetter 

class Product: 
    def __init__(self, price, height, width): 
     self.price = price 
     self.height = height 
     self.width = width 

    def __eq__(self, val): 
     attrs = ('width', 'price', 'height') 
     return attrgetter(*attrs)(self) == attrgetter(*attrs)(val) 

    def __ne__(self, val): 
     attrs = ('width', 'price', 'height') 
     return attrgetter(*attrs)(self) != attrgetter(*attrs)(val) 

संपादित करें:

@Ashwini अजगर विकि पर आधारित टिप्पणी में उल्लेख किया है:

तुलना ऑपरेटरों के बीच कोई निहित रिश्ते रहे हैं। x==y की सच्चाई यह नहीं दर्शाती है कि x!=y गलत है। तदनुसार, __eq__() को परिभाषित करते समय, __ne__() को भी परिभाषित करना चाहिए ताकि ऑपरेटर अपेक्षित व्यवहार करेंगे।

तो एक और व्यापक तरीके के रूप में मैंने ऑब्जेक्ट में __ne__ विशेषता भी जोड़ा। जो गुणों में से एक है यदि किसी एक विशेषता अन्य ऑब्जेक्ट में इसके रिश्तेदार के बराबर नहीं है।

डेमो:

prod_list = [] 
prod1 = Product(3, 3, 3) 
prod_list.append(prod1) 

prod2 = Product(3, 3, 2) 
prod_list.append(prod2) 

prod3 = Product(3, 3, 3) 
print prod3 in prod_list 
True 
prod3 = Product(3, 3, 5) 
print prod3 in prod_list 
False 
+3

** ध्यान दें ** [ 'एक्स == y' की सच्चाई मतलब यह नहीं है कि' एक्स = y' गलत है!। तदनुसार, '__eq __() 'को परिभाषित करते समय, किसी को भी __ne __()' को परिभाषित करना चाहिए ताकि ऑपरेटर अपेक्षित व्यवहार कर सकें।] (Https://docs.python.org/2/reference/datamodel.html#object। __eq__) –

+0

@ अश्विनी चौधरी, महान टिप्पणी के लिए धन्यवाद, लेकिन क्या आप कृपया मुझे दिखा सकते हैं कि '__ne __() 'को परिभाषित करने के लिए कैसे? मुझे इसके बारे में कोई जानकारी नहीं है हालांकि मैंने आपका लिंक पढ़ा है। –

+0

@ अश्विनी चौधरी वास्तव में, नोट के लिए धन्यवाद। – Kasramvd

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