2011-08-17 12 views

उत्तर

18

एक ही रास्ता:

>>> l = [('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')] 
>>> [t for t in l if t[0].startswith('img')] 
[('img-1', 'iii'), ('img-2', 'jjj')] 

एक और तरीका है:

>>> filter(lambda x: x[0].startswith('img'), l) 
[('img-1', 'iii'), ('img-2', 'jjj')] 

पहले एक सूची समझ कहा जाता है। संबंधित तकनीक के लिए F.C.'s answer देखें। मूल वाक्यविन्यास [{expression} for {item_var_or_vars} in {iterable} if {boolean_expression}] है। यह अर्थ की दृष्टि से कुछ इस तरह के बराबर है:

new_list = [] 
for {item_var_or_vars} in {iterable}: 
    if {boolean_expression}: 
     new_list.append({expression}) 

if {boolean_expression} सा वैकल्पिक है, बस के रूप में यह पाश के लिए में है।

दूसरी बस में निर्मित समारोह filter है, जो एक परीक्षण समारोह और एक iterable स्वीकार करता है, और हर तत्व यह है कि "गुजरता" परीक्षण समारोह युक्त एक सूची देता है। lambda, यदि आपने इसे पहले नहीं देखा है, तो फ़ंक्शन को परिभाषित करने का एक त्वरित तरीका है।

def keep_this_element(element): 
    return element[0].startswith('img') # returns True for ('img...', '...') 

new_list = filter(keep_this_element, l) # keeps only elements that return True 
+1

यह बहुत अच्छा है। क्या इन दोनों तकनीकों का नाम है? मैं इन तरीकों पर और अधिक पढ़ना चाहता हूं। धन्यवाद। – sidewinder

+1

@Awais, अधिक विस्तृत स्पष्टीकरण के लिए मेरे संपादन देखें। – senderle

+1

पहला एक [सूची समझ] है (http://docs.python.org/tutorial/datastructures.html#list-comprehensions) दूसरा है [फ़िल्टर] (http://docs.python.org/library/functions .html # फ़िल्टर) और एक [लैम्ब्डा अभिव्यक्ति] (http://docs.python.org/reference/expressions.html#lambda) – agf

6

शायद ऐसा कुछ?

l2 = [item for item in l1 if item[0].startswith('img')] 
+0

यह अच्छा है: आप इस के बजाय कर सकता है। धन्यवाद! – sidewinder

3

बस एक और तरीके के साथ generator expression (यह बड़ी सूचियों पर कुछ अंतर ला सकती है)

>>> l = [('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')] 
>>> (x for x in l if x[0].find('img') == 0) 
0: <generator object <genexpr> at 0x917a00> 
>>> gen = (x for x in l if x[0].find('img') == 0) 
>>> list(gen) 
1: [('img-1', 'iii'), ('img-2', 'jjj')] 
1
tuple_filter = lambda t, i, w: filter(lambda a: a[i].startswith(w), t) 
newtuple = tuple_filter(thetuple, 0, 'img') 
संबंधित मुद्दे