2010-03-26 33 views
9

को देखते हुए दो सूचियों:उन्नत अजगर सूची समझ

chars = ['ab', 'bc', 'ca'] 
words = ['abc', 'bca', 'dac', 'dbc', 'cba'] 

कैसे आप निम्न स्थिति द्वारा सूची comprehensions उपयोग कर सकते हैं words की फ़िल्टर की गई सूची उत्पन्न करने के लिए: दिए गए प्रत्येक शब्द की लंबाई n की है कि और chars लंबाई n की है साथ ही, फ़िल्टर की गई सूची में केवल वे शब्द शामिल होना चाहिए जो प्रत्येक i -th चरित्र i -th स्ट्रिंग words में है।

इस मामले में, हमें परिणामस्वरूप ['abc', 'bca'] प्राप्त करना चाहिए।

उत्तर

12
[w for w in words if all([w[i] in chars[i] for i in range(len(w))])] 
+2

सच कहूं, मैं पसंद @ SilentGhost का जवाब। –

19
>>> [word for word in words if all(l in chars[i] for i, l in enumerate(word))] 
['abc', 'bca'] 
3

(यह किसी के लिए परिचित लग रहा है, यह पिछले Google कोड जाम में सवालों में से एक था) का उपयोग करना जिप:

[w for w in words if all([a in c for a, c in zip(w, chars)])] 

या का उपयोग कर की गणना:

[w for w in words if not [w for i, c in enumerate(chars) if w[i] not in c]] 
-1

इतना पूर्ण क्यों एक्स? यह रूप में अच्छी तरह से काम करता है:

[words[x] for x in range(len(chars)) if chars[x] in words[x]] 
+0

यह 'बीबीसी' शब्द नहीं पकड़ेगा – steabert

0

यह काम करता है index का उपयोग कर:

[words[chars.index(char)] for char in chars if char in words[chars.index(char)]] 

मैं कुछ याद आ रही है?

+0

'बीसीसी', 'बीबीसी' जैसे तारों से मेल नहीं खाता है। इसके अतिरिक्त 'char.index' तोड़ देगा यदि सूची 'वर्ण' में डुप्लिकेट स्ट्रिंग हैं। – Philar

0

एक और अधिक सरल दृष्टिकोण:

yourlist = [ w for w in words for ch in chars if w.startswith(ch) ] 
+0

ओमटेड हालत "प्रत्येक i-th वर्ण शब्दों में i-th स्ट्रिंग में है"। – hynekcer

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