2013-08-08 16 views
6

のリストのサブセットを反復処理は、私はタプルの第二の要素が1であるアイテムを反復したいのpython - タプル

l = [(4,1), (5,1), (3,2), (7,1), (6,0)] 

を次のように私はタプルのリストを持っているとしましょう?

私はループのif条件を使用してそれを行うことができますが、私はそこにあることを願っていましたpythonicやり方?

おかげ

+0

うーん、自己への注意:使用することはありません '記号「l'(ell)」を意味する。同様に 'O'(Oh)。 –

答えて

6

あなたはリストの内包表記を使用することができます。

[ x for x in l if x[1] == 1 ] 

あなたにも発電機の構文を使用してタプルを反復処理することができます

for tup in (x for x in l if x[1] == 1): 
    ... 
+3

そのgenexpは、同等の 'if'文よりも読みにくいです。これは悪い考えのようです。 – user2357112

3

どの程度

ones = [(x, y) for x, y in l if y == 1] 

または

ones = filter(lambda x: x[1] == 1, l) 
1

list comprehensionsを使用して、問題を解決するためのニシキヘビの方法で、これを試してみてください:

lst = [(4,1), (5,1), (3,2), (7,1), (6,0)] 
[(x, y) for x, y in lst if y == 1] 
=> [(4, 1), (5, 1), (7, 1)] 

お知らせどのように我々タプルを展開してx, yを使用してペア内の各要素を取得し、条件if y == 1がそのペアの2番目の要素に値1の要素のみをフィルタリングする方法。その後、あなたが見つかった要素で、あなたが欲しいものを行うことができ、特に、私は左でこの部分にオリジナルのペアを再構築しています:(x, y)

3

だけifを使用しています。それは明確でシンプルです。

for x, y in tuples: 
    if y == 1: 
     do_whatever_with(x) 
+1

* "ループのif条件を使用して行うことができますが、それを行うためのもっと細かい方法があることを望んでいますか?" * – arshajii

+1

これはPythonicのやり方です。ジェネレータとリスト内包は意図した目的には問題ありませんが、実際にはイテラブルを構築するのではなく、何かを反復する必要がある場合は、この方法があります。あなたは正直言って、genexpのループはより読みやすくなっていますか? – user2357112

2

それ以上の発電機をビルドします。

has_1 = (tup for tup in l if l[1] == 1) 
for item in has_1: 
    pass 
1

あなたが反復処理したいので、itertools.ifilterが素敵なソリューションです:

from itertools import ifilter 
iter = ifilter(lambda x: x[1] == 1, l) 
for item in iter: 
    pass 
+0

これは、テストが 'if'節で簡単に捕捉できる素晴らしい解決策ではありません。 – Marcin

2
for e in filter(l, lambda x: x[1] == 1): 
    print e