2010-04-29 11 views
12

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

[s for s in strings if some (lambda f: re.match (f, s), filters)] 

जहां कुछ

के रूप में परिभाषित किया गया है लिखते हैं
def some (pred, list): 
    for x in list: 
     res = pred (x) 
     if res: 
      return res 
    return False 

अजगर में पहले से ही उपलब्ध ऐसा ही कुछ है, या वहाँ यह करने के लिए एक और अधिक मुहावरेदार तरीका है?

उत्तर

17

any नामक एक फ़ंक्शन है जो लगभग इच्छित चाहता है। मुझे लगता है कि आप इस के लिए देख रहे हैं:

[s for s in strings if any(re.match(f, s) for f in filters)] 
7
[s for s in strings if any(re.match (f, s) for f in filters)] 
1

अजगर लैम्ब्डा अपने लिस्प समकक्षों के रूप में शक्तिशाली रूप में केवल एक अंश है।

अजगर lambdas में, ब्लॉक शामिल नहीं कर सकते तो पाश के लिए एक लैम्ब्डा के लिए संभव नहीं है

मैं एक बंद का उपयोग करें ताकि आप न होता सूची हर बार भेजने के लिए

def makesome(list): 
    def some(s) 
     for x in list: 
      if x.match(s): 
       return True 
     return False 
    return some 

some = makesome(list) 

[s for s in strings if some(s)] 
+0

के अपने आकलन पाइथन का लैम्बडास सत्य है, जबकि अंश 0.9 है। –

+0

इस पर एक अच्छा परिप्रेक्ष्य है "एक फिल्म के ट्रेलर को देखना पसंद है। रोमांचक, लेकिन असली चीज़ नहीं है।" http://rapd.wordpress.com/2007/05/09/lambda-in-python/ - हालांकि एक लिस्पर परिप्रेक्ष्य से, मैं स्वच्छ कोड के लिए अपना उत्साह साझा नहीं करता, मुझे कार्यक्षमता देता हूं। –

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