2009-04-18 27 views
15

पायथन में मेरे रोमांच जारी हैं और मेरी पसंदीदा किताबें फिर से चुप हैं। अजगर, एक अंतर्निहित तरीका अगर एक चर एक iterable ऑब्जेक्ट के अंदर है परीक्षण करने के लिए प्रदान करता है कीवर्ड 'में' का उपयोग:पायथन, "ए इन बी" कीवर्ड, एकाधिक के बारे में कैसे?

if "a" in "abrakadabra" : 
    print "it is definitely here" 

लेकिन यह संभव हो तो एक से अधिक आइटम सूची में है परीक्षण करने के लिए (किसी भी एक है)? वर्तमान में, मैं वाक्य रचना नीचे उपयोग कर रहा हूँ, लेकिन यह थोड़े लंबा है:

if "// @in " in sTxt or "// @out " in sTxt or "// @ret " in sTxt or <10 more> 
    print "found." 

पाठ्यक्रम regexes के मदद कर सकते हैं, लेकिन regexes का उपयोग कर कोड के वर्बोज़ की बहुत सारी ले जाएगा और के रूप में "एक के रूप में स्पष्ट नहीं किया जाएगा बी में"। क्या कोई अन्य पाइथोनिक तरीके हैं?

उत्तर

45
alternatives = ("// @in ", "// @out ", "// @ret ") 
if any(a in sTxT for a in alternatives): 
    print "found" 

if all(a in sTxT for a in alternatives): 
    print "found all" 

any() और all() एक iterable और जांच करता है कि किसी भी लेता है/उन सभी को एक सही मूल्य का मूल्यांकन। जनरेटर अभिव्यक्तियों के साथ संयोजन करें, और आप एकाधिक वस्तुओं की जांच कर सकते हैं।

+5

मैंने प्रलेखन के लिंक जोड़े हैं, इसलिए एसएलट आपको कम नहीं करता है;) सभी गंभीरता में, हालांकि, इसे दस्तावेज़ों से जोड़ने के लिए प्रोत्साहित किया जाता है, उम्मीद है कि आपको कोई फर्क नहीं पड़ता। –

+0

बिलकुल नहीं। धन्यवाद। –

7

any(snippet in text_body for snippet in ("hi", "foo", "bar", "spam"))

0

ऐसा करने के लिए वाक्यविन्यास में कोई भी तरीका नहीं बनाया गया है। हालांकि आप इसे 'आसान' बनाने के लिए 'किसी भी' फ़ंक्शन का उपयोग कर सकते हैं क्योंकि @MizardX और @Benjamin पीटरसन ने दिखाया है।

1

आप किसी भी जांच तो आप इस का प्रयोग करेंगे चाहते हैं:

inthere = True 
checks = ('a', 'b') 

for check in checks: 
    if check not in 'abrakadabra': 
     inthere = False 
     break 

संपादित करें: यह नहीं पता था

inthere = False 
checks = ('a', 'b') 

for check in checks: 
    if check in 'abrakadabra': 
     inthere = True 
     break 

आप सभी जांच तो आप इस इस्तेमाल कर सकते हैं चाहते हैं अधिक पायथनिक any()। पाइथन पर इसका उपयोग करना शायद बेहतर है।

EDIT2: ब्रेक स्टेटमेंट जोड़ा गया, और सभी -case को सही किया।

1

तुम भी set methods and operators इस्तेमाल कर सकते हैं:

not alternatives.isdisjoint(sTxt) # for "any" 
(alternatives & sTxt) != set() # Again, the intersection is nonempty 
alternatives <= sTxt # for "all" 

मुझे लगता है कि इन किसी एक या सभी का उपयोग करने से पढ़ने में आसान हैं, लेकिन सेट में अपने संग्रह कन्वर्ट करना होगा। चूंकि छेड़छाड़ और रोकथाम आप की परवाह करते हैं, इसलिए आप उन्हें पहले स्थान पर सेट करने पर विचार कर सकते हैं।

+0

एसटीटीटी एक स्ट्रिंग है अगर काम नहीं करता है। –

+0

मेरा उत्तर उल्लेख करता है कि इन वस्तुओं को सेट करना होगा। – allyourcode

6

यदि आप एक ही शब्द के लिए बहुत सारी लाइनों का परीक्षण कर रहे हैं, तो उन्हें नियमित अभिव्यक्ति के रूप में संकलित करना तेज़ हो सकता है। उदाहरण के लिए:

import re 
words = ["// @in ", "// @out ", "// @ret "] + ["// @test%s " % i for i in range(10)] 

my_regex = re.compile("|".join(map(re.escape, words))) 

for line in lines_to_search: 
    if my_regex.search(line): print "Found match" 

कुछ त्वरित समय पता चलता है कि यह आम तौर पर any(word in theString for word in words) दृष्टिकोण की तुलना में तेजी है। मैंने अलग-अलग पाठ के साथ दोनों दृष्टिकोणों का परीक्षण किया है (छोटे/लंबे समय तक/बिना मैचों के)। यहाँ परिणाम हैं:

  { No keywords } | {contain Keywords } 
     short long  short long 
regex : 0.214 27.214  0.147 0.149 
any in : 0.579 81.341  0.295 0.300 

प्रदर्शन हालांकि कोई फर्क नहीं पड़ता, तो any() दृष्टिकोण अधिक पठनीय है।

+0

\ o/दावा करना अच्छा है कि "तेजी से .." दावा के साथ बेंचमार्क होना चाहिए! – dbr

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