2012-04-08 12 views
9

मैं अक्सरपायथन में यदि x == 1 या x == 5 या x == 10 ... लिखने के कुछ अन्य तरीके क्या हैं?

if x == 1 or x == 5 or x == 10 or x == 22 : 
    pass 

यह x दोहरा रखने के लिए अनावश्यक प्रतीत अंग्रेजी में की तरह कोड लिखने खत्म, वहाँ इस तरह एक अगर बयान को लिखने के लिए एक आसान या कम तरीका है?

शायद के मूल्य को एक tuple (1, 5, 10, 22,) या किसी चीज़ में अस्तित्व की जांच कर रहा है?

+2

हाँ, 'अगर में एक्स [1, 50, 10, 22]' सरल है लिखने के लिए और मैंने लिखा है कि –

उत्तर

14

हां, आप सही हैं - या तो एक टुपल में या (यदि यह चेक बार-बार किया जाता है) एक सेट में।

तो या तो

if x in (1, 5, 10, 22): 
    pass 

करते हैं या आप इस चेक अक्सर करते हैं और मूल्यों की संख्या काफी बड़ी है,

myset = set((1, 5, 10, 22)) 

[...] 

if x in myset: 
    pass 

myset सामान और अधिक उपयोगी है, और अधिक मूल्यों आप है अगर जांचना चाहते हैं। 4 मान काफी कम हैं, इसलिए आप इसे सरल रख सकते हैं। 400 मूल्यों और आपको सेट का उपयोग करना चाहिए ...

मार्सीन द्वारा इंगित एक और पहलू, सेट में लुकअप के लिए आवश्यक हैशिंग है जो इच्छित सूची के लिए रैखिक रूप से एक सूची या टुपल की तुलना में अधिक महंगा हो सकता है।

+7

पायथन 2.7/3. * में, आप एक सेट शाब्दिक का भी उपयोग कर सकते हैं: '{1, 5, 10, 22}'। पाइथन 3.2+ में, यदि आप केवल 'इन' चेक कर रहे हैं (हालांकि यदि आप एक चर में परिणाम सहेज रहे हैं) तो यह पारदर्शी रूप से 'फ्रोजनसेट' का उपयोग करने के लिए अनुकूलित करता है। सेट करने के लिए पहले के लिए – Dougal

+2

+1, लेकिन मुझे डगल से सहमत होना है कि यदि संभव हो तो आपको नए वाक्यविन्यास का उपयोग करना चाहिए। –

+1

'सेट ((1, 5, 10, 22))' '1, 5, 10, 22} 'से अधिक संस्करणों में काम करता है और वास्तव में यह सब अधिक पठनीय IMHO नहीं है। – martineau

6

आप एक संग्रह के साथ in उपयोग कर सकते हैं:

if x in [1, 5, 10, 22]: 
    # etc... 

if x in {1, 5, 10, 22}: # New syntax for creating sets 
    # etc... 

ध्यान दें कि यह एक नई सूची हर बार लाइन निष्पादित करता है पैदा करेगा। यदि दक्षता चिंता का विषय है, तो संग्रह केवल एक बार बनाएं और इसका पुन: उपयोग करें।

+0

... या एक सेट पढ़ें। 4 मूल्यों के साथ इतना जरूरी नहीं है, 40, 400 या 4000 के साथ अधिक जरूरी है ... – glglgl

+0

हालांकि, एक ट्यूपल अधिक आम है और एक सेट अर्थात् अच्छी तरह से अच्छा है, दोनों प्रदर्शन प्रदर्शनों को भी छूट देता है (बाद के मामले में पायथन संस्करण के आधार पर) । – delnan

+0

@glglgl: ओह हाँ, एक सेट एक बेहतर विचार है। टुपल का आमतौर पर उपयोग किया जाता है, लेकिन मुझे लगता है कि यह अर्थात् सबसे उपयुक्त प्रकार नहीं है। –

2

आप अच्छा प्रदर्शन की जरूरत है और एक सेट एक ही तुलना कई बार दोहराने के लिए, का उपयोग जा रहे हैं:

s = frozenset([1, 5, 10, 22]) # at the beginning 

if x in s: # in your code 
    pass 
+3

बेशक, छोटे डेटा सेट के लिए एक ट्यूपल तेज हो सकता है (हैश, सरल डेटा संरचना, कोई टक्कर जोखिम नहीं है) और पायथन 3.2 में, आपको यह अनुकूलन मुफ्त में मिलता है (यहां तक ​​कि बेहतर, फ्रोजनसेट केवल एक बार बनाया जाता है) यदि आप इस स्थिति में एक सेट अक्षर का उपयोग करते हैं। साथ ही, सभी प्रदर्शन समस्याओं के साथ समान नियम और शर्तें: (1) गीले मापें आपको इसे अनुकूलित करने की आवश्यकता है। (2) फिर से # 2 करो! (3) वास्तव में यकीन है? (4) ठीक है, ठीक है! अपने विकल्पों को इकट्ठा करें और उन्हें अच्छी तरह से बेंचमार्क करें। – delnan

+0

तो 'फ्रोजनसेट' बनाना, नियमित 'सूची' बनाने और 'सेट' बनाने से तेज़ है? – George

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