2010-02-22 11 views
7
if 'string1' in line: ... 

... चेकों की उम्मीद काम करता है के रूप में लेकिन क्या मैं इतनी जैसे कई तार जांच करने की आवश्यकता है, तो:एकाधिक मूल्य ऑपरेटर 'में' का उपयोग कर (अजगर)

if 'string1' or 'string2' or 'string3' in line: ... 

... प्रतीत नहीं होता है काम।

उत्तर

20
if any(s in line for s in ('string1', 'string2', ...)): 
1
if 'string1' in line or 'string2' in line or 'string3' in line: 

है कि आप क्या करने की जरूरत के लिए ठीक होगा?

+0

संभोग, मैंने जो कोशिश की लेकिन मुझे एक और अधिक पठनीय और कुशल विधि की आवश्यकता थी। :) – 3zzy

1

or इस तरह से व्यवहार नहीं करता है। 'string1' or 'string2' or 'string3' in line('string1') or ('string2') or ('string3' in line) के समतुल्य है, जो हमेशा सत्य (वास्तव में, 'string1') वापस आ जाएगा।

इच्छित व्यवहार प्राप्त करने के लिए, आप if any(s in line for s in ('string1', 'string2', 'string3')): कह सकते हैं।

2

आप इस

if ('string1') or ('string2') or ('string3' in line): 

की तरह अभिव्यक्ति पढ़ें समस्या स्पष्ट हो जाता है। क्या होगा कि 'स्ट्रिंग 1' सही पर मूल्यांकन करता है ताकि शेष अभिव्यक्ति शॉर्टक्रिक हो।

लंबे हाथ जिस तरह से यह लिखने के लिए इस

if 'string1' in line or 'string2' in line or 'string3' in line: 

कौन सा एक सा दोहराव है, इसलिए इस मामले में यह इग्नेसियो के जवाब

0

में तरह any() उपयोग करने के लिए map और lambda

का उपयोग करना बेहतर है है
a = ["a", "b", "c"] 
b = ["a", "d", "e"] 
c = ["1", "2", "3"] 

# any element in `a` is a element of `b` ? 
any(map(lambda x:x in b, a)) 
>>> True 

# any element in `a` is a element of `c` ? 
any(map(lambda x:x in c, a)) # any element in `a` is a element of `c` ? 
>>> False 

और हाई-ऑर्डर फ़ंक्शन

has_any = lambda b: lambda a: any(map(lambda x:x in b, a)) 

# using ... 
f1 = has_any([1,2,3,]) 
f1([3,4,5,]) 
>>> True 
f1([6,7,8,]) 
>>> False 
संबंधित मुद्दे