2011-08-17 52 views
6

假設我有這樣一個元組:查找在一個元組元素,並篩選他們

[('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')] 

我想篩選出的名單,併產生一個新的有與「IMG」開頭的元素。所以我的新列表將如下所示:

[('img-1','iii'), ('img-2','jjj')] 

謝謝!

回答

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}位是可選的,只是因爲它是在for循環。

第二個是簡單的內置函數filter,它接受一個測試函數和一個可迭代的函數,並返回一個包含「傳遞」測試函數的每個元素的列表。 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

第一個是[list comprehension](http://docs.python.org/tutorial/datastructures.html#list-comprehensions)第二個是[filter](http://docs.python.org/library/functions .html#filter)和[lambda表達式](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') 
相關問題