2010-03-12 19 views
37

मैं एक समारोह स्ट्रिंग की एक सूची से गांठ बाहर ले सकते हैं और उन्हें एक सूची के रूप में वापसी करनी में फिर से मैच वस्तुओं का उपयोग करें:कैसे एक सूची समझ

def filterPick(lines,regex): 
    result = [] 
    for l in lines: 
     match = re.search(regex,l) 
     if match: 
      result += [match.group(1)] 
    return result 

वहाँ एक सूची के रूप में इस धूमिल करने के लिए एक रास्ता है समझ? जाहिर है यह काफी स्पष्ट है; बस उत्सुक।


जो लोग @Alex के लिए योगदान दिया है, विशेष रूप से उल्लेखनीय के लिए धन्यवाद। मेरे द्वारा समाप्त किए गए कार्यों का एक संघनित संस्करण यहां दिया गया है; - कि आप कैसे "निर्दिष्ट" एक मूल्य है कि आप उपयोग करने की आवश्यकता है

import re 

def filterPick(list,filter): 
    return [ (l, m.group(1)) for l in list for m in (filter(l),) if m] 

theList = ["foo", "bar", "baz", "qurx", "bother"] 
searchRegex = re.compile('(a|r$)').search 
x = filterPick(theList,searchRegex) 

>> [('bar', 'a'), ('baz', 'a'), ('bother', 'r')] 

उत्तर

66
[m.group(1) for l in lines for m in [regex.search(l)] if m] 

"चाल" for m in [regex.search(l)] हिस्सा है: regex मैच विधि एक "पूर्व फहराया" पैरामीटर के रूप में filterPick को पारित कर दिया है एक बार से अधिक, एक सूची समझ के भीतर - केवल इतना खंड जोड़ें, जहां ऑब्जेक्ट एक एकल आइटम सूची में "पुनरावृत्त" होता है जिसमें एक मान होता है जिसे आप "असाइन करना" चाहते हैं। कुछ इस स्टाइलिस्टिक रूप से संदिग्ध मानते हैं, लेकिन मुझे कभी-कभी व्यावहारिक लगता है।

+1

एलेक्स, मुझे यह पसंद है; धन्यवाद और +1। मेरे पास इस कोड के साथ कुछ काफी भारी उठाना है - क्या मुझे "गलत इटरेटर" को सेट अप और फायर-अप करने के अतिरिक्त ओवरहेड के बारे में चिंता करनी चाहिए? बीटीडब्लू मैं "बाद में अनुकूलित" के सिद्धांत की सदस्यता लेता हूं। –

+1

@ ब्रेंट, "गलत इटरेटर" खोज कॉल नगण्य होना चाहिए; एक मामूली अनुकूलन '(regex.search (l), '' 'regex.search (l)]' के बदले में है (जो मुझे अधिक पठनीय लगता है लेकिन धीमा धीमा है - मैंने सोचा कि आप संभवतः नहीं हो सकते जल्दी में जब आप वास्तव में पुनः ऑब्जेक्ट की विधि के बजाय मॉड्यूल से 're.search' फ़ंक्शन को कॉल कर रहे थे। list rep के बाहर 'regex.search' को बाध्य विधि के रूप में खींचना एक और मामूली लेकिन उपयोगी अनुकूलन है, btw। –

+0

जैसे ही मैंने आपका जवाब देखा, मुझे एहसास हुआ कि re.search का उपयोग करने का सबसे अच्छा तरीका नहीं था। क्या आप मेरे लिए स्पष्टीकरण दे सकते हैं कि आप "regex.search को listcomp के बाहर एक बाध्य विधि के रूप में कैसे खींचें"? मैं वास्तव में सराहना करता हूं 'असाइनमेंट' बिट के लिए एक listcomp और पायथन नोब –

9
return [m.group(1) for m in (re.search(regex, l) for l in lines) if m] 
7

यह थोड़ा

def filterPick(lines, regex): 
    matches = map(re.compile(regex).match, lines) 
    return [m.group(1) for m in matches if m] 

आप एक पंक्ति में यह सब डाल सकता है छोटा किया जा सकता है, लेकिन मतलब यह होगा कि आप हर पंक्ति जो दो बार थोड़ा कम कुशल होगा मैच के लिए होगा।

+2

नहीं, प्रत्येक पंक्ति को दो बार मिलान करने की आवश्यकता नहीं है, मेरा जवाब देखें। –

+0

वास्तव में, आपका उत्तर बहुत साफ है, मेरे द्वारा +1 :) – Wolph

-13
>>> "a" in "a visit to the dentist" 
True 
>>> "a" not in "a visit to the dentist" 
False 

भी P` में, एक खोज क्वेरी आप एक सूची

`पी = 'एक', 'बी' में नीचे शिकार कर रहे हैं के साथ काम करता है कि 'सी'

'बी' सच आता है

+1

यह सवाल का उत्तर कैसे देता है? –

+0

यह प्रश्न किसी सूची में इनपुट की जांच करने के लिए एक बेहतर तरीका पेश कर सकते हैं, लेकिन अगर आप परिणाम देने के लिए काम नहीं करते हैं तो वैसे काम नहीं करते हैं। यू फिर से आउटपुट के आसपास एक साधारण पाश कर सकते हैं। एक ऐसा फ़ंक्शन का उपयोग करने से मैन्युअल रूप से ऐसा करने में बहुत अंतर नहीं है जो वही करता है ... – erm3nda

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