2012-11-29 15 views
5

क्या किसी सूची (या dict) समझ में फ़ंक्शन की वापसी का परीक्षण करने का कोई तरीका है? मैं लिखने से बचना चाहता हूं कि:पायथन सूची समझ: परीक्षण फ़ंक्शन रिटर्न

lst = [] 
for x in range(10): 
    bar = foo(x) 
    if bar: 
    lst.append(bar) 

और इसके बजाय एक सूची समझ का उपयोग करें। जाहिर है, मैं लिखना नहीं चाहता:

[foo(x) for x in range(10) if foo(x)] 

तो?

[foo(x) for x in range(10) if ??? ] 
+1

क्यों नहीं है आप पहली बार जिस तरह से उपयोग करना चाहते हैं? यह उचित तरीका है। –

+0

@ रोहित जैन - 'foo' के आधार पर, यह एक महंगा ऑपरेशन हो सकता है जिसे आप दो बार नहीं करना चाहते हैं। – mgilson

+1

@ मिगिलसन: और पहले उदाहरण में, वह केवल एक बार ऐसा करता है। –

उत्तर

10

कैसे

के बारे में
filter(None, map(foo, range(10))) 

आप मध्यवर्ती सूची रखने के लिए नहीं करना चाहते हैं, itertools.imap() साथ map() बदलें। और itertools.ifilter() के साथ, पूरी चीज जनरेटर में बदल दी जा सकती है।

itertools.ifilter(None, itertools.imap(foo, range(10))) 
+1

मैं हमेशा की तरह 'महसूस किया filter' के रूप में अच्छी तरह से एक 1 तर्क रूप ले चाहिए ... – mgilson

+1

या, बजाय 'imap', आप एक genexp का उपयोग कर सकते हैं: 'फ़िल्टर (कोई नहीं, (x) श्रेणी में एक्स के लिए (foo (x))) – mgilson

+0

वास्तव में अच्छा समाधान। – Adrien

5

बस मूल्यों की गणना करने और जेनरेटर से फ़िल्टर की गई सूची बनाने के लिए जनरेटर बनाएं।

उदाहरण:

# create generator via generator expression 
results = (foo(x) for x in xrange(10)) 
# build result list, not including falsy values 
filtered_results = [i for i in results if i] 

संदर्भ के लिए:

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