2011-01-01 32 views
0

リストのリストがあります。サイズは三つの要素の内側のリストを言うと次のようになります。2次元リストからのpython条件付きリストの作成

['apple', 'fruit', 1.23] 

外側のリストは、私が外リストを反復し、一時的なリストについては、データを間引くしたいこの

data = [['apple', 'fruit', 1.23], 
     ['pear', 'fruit', 2.34], 
     ['lettuce', 'vegetable', 3.45]] 

のように見えます要素1がいくつかのキーワード(aka: 'fruit')と一致する場合私は果物を一致てるのであれば、私はこれで終わるだろう:

tempList = [('apple', 1.23), ('pear', 2.34)] 

これは、これを実現する一つの方法です:

tempList = [] 
for i in data: 
    if i[1] == 'fruit': 
     tempList.append(i[0], i[2]) 

は少ないでこれを行うには、いくつかの「Python的」な方法がありますライン?

答えて

3

リスト内包、リスト、ちょうどシーケンスを必要としない場合は、タプルのインデックスを使用するか、また

tempList = [(i[0], i[2]) for i in data if i[1] == 'fruit'] 
tempList = [i[:1]+i[2:] for i in data if i[1] == 'fruit'] 

をスライスし、ジェネレータ式。 (ここではタプル開梱と)

>>> tempListGen = ((a,c) for a,b,c in data if b == 'fruit') 
>>> tempListGen 
<generator object <genexpr> at 0x0266FD50> 
>>> print sorted(tempListGen) 
[('apple', 1.23), ('pear', 2.34)] 

(Pythonの2.7でテスト済み)

+0

これは(簡潔さのために)私の質問に記載されなかったにもかかわらず、私の内側のリストはかなり長いので、完全なアンパックの代わりにインデクス(i [x])を使用すると便利です – dls

+0

これは何も削除しません... – 6502

+0

@dls:i [:1] + i [2:]をスライスして1つの要素を削除するコピー。 (正しい構文で、ありがとう、6502!) – Macke

5
[(i, k) for i, j, k in data if j == 'fruit'] 
+0

アンパックをうまく使う。 :) – Macke

1

一覧理解!

同じ結果が表示される行は少なくなり、おそらくより高速に実行されます。

0
[[x[0], x[2]] for x in data if x[1] == 'fruit'] 
3

タプルの割り当ては、コンパクトさのためにリスト内包と対になって、理解したコードを簡単に作ることができます:

tempList = [(item, price) for item, kind, price in data if kind == 'fruit'] 
関連する問題