2010-08-24 10 views
8

मैं निम्न सूची s के साथ शुरू और b bitmask:एक सूची और बिटमैस्क को देखते हुए, मैं उन सूचकांकों पर मूल्य कैसे वापस कर सकता हूं जो सच हैं?

s = ['baa', 'baa', 'black', 'sheep', 'have', 'you', 'any', 'wool'] 
b = [1, 0, 0, 0, 1, 1, 1, 0] # or any iterable with boolean values 

मैं कुछ समारोह कैसे लिख सकता हूँ apply_bitmask(s, b) इतना है कि यह रिटर्न

['baa', 'have', 'you', 'any'] 

उत्तर

17

अजगर 3.1 itertools.compress (या Python 2.7's अगर आप अभी तक अपग्रेड नहीं) वास्तव में है कि (सूची समझ कोई वास्तविक पास पीछे नहीं है):

import itertools 
filtered = itertools.compress(s, b) 

ध्यान दें कि यह पुनरावर्तक, नहीं एक सूची पैदा करता है। स्मृति बचाता है, लेकिन यदि आपको इसे कई बार पुन: स्थापित करने या सूचकांक का उपयोग करने की आवश्यकता है, तो आप हमेशा list(itertools.compress(s, b)) का उपयोग कर सकते हैं। अभी भी छोटा

+0

वाह, यह प्रभावशाली है। उस delnan के लिए चीयर्स - Itertools के बारे में कभी नहीं पता था। – Stephen

+0

@ स्टीफन: इटरटॉल्स वास्तव में प्रभावशाली है - न केवल यह स्टेरॉयड पर इटरेटर रखता है (जैसे पाइथन 3 में डाइव इसे डाल दिया जाता है), उनमें से कई को 5 से कम लाइनों में परिभाषित किया जा सकता है। लगभग हास्केल की तरह लगता है: डी – delnan

+0

क्या मैं इसका उपयोग '2.6.5' के साथ कर सकता हूं? – Kit

10
[ item for item, flag in zip(s, b) if flag == 1 ] 
8

आप list comprehensions उपयोग कर सकते हैं:

newList = [word for (word, mask) in zip(s,b) if mask] 
# Note: Could also use 'if mask == blah', if mask is not a boolean-compatible type. 

यह पहली बार मूल दो सूचियां लेता है, और zips उन्हें एक साथ ले जाता है, ताकि आपको शब्दों के जोड़े और उनके मुखौटे की सूची (अस्थायी - यह अभी भी सूची कंप के अंदर है!) - [('baa',1), ('baa',0),...] जैसे कुछ। फिर केवल वे शब्द जिनके पास 1 (if mask == 1) का मुखौटा है, newList में जोड़े गए हैं।

+0

का उपयोग कर हालांकि मैं 'का उपयोग करेंगे ... अगर mask', क्योंकि वह सही मूल्य के बारे में पूछा witout, के बारे में नहीं' विशेष रूप से 1'। – delnan

+0

यह सच है। मैं इसे उत्तर में जोड़ दूंगा। धन्यवाद delnan। – Stephen

0

एक और सूची समझ पर ले, ज़िप

newList = [item for i, item in enumerate(s) if b[i]] 
संबंधित मुद्दे

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