2011-08-17 5 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}ビットは、それがためにループしているだけのように、オプションである:それはこのようなものと同じ意味です。

2つ目は、単に組み込み関数filterです。これは、テスト関数とiterableを受け取り、テスト関数を "渡す"すべての要素を含むリストを返します。 lambda、これまで見たことがない場合は、関数を定義するための素早い方法です。あなたは代わりにこれを行うことができます:generator expressionは(それが大規模なリストにいくつかの違いを作ることができる)で

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)、2番目は[filter](http://docs.python.org/library/functions .html#filter)と[lambda expression](http://docs.python.org/reference/expressions.html#lambda) – agf

6

これはおそらく何か?

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

これは良いです。ありがとう! – sidewinder

3

ちょうど別の方法

>>> 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') 
関連する問題