2016-03-30 17 views
1

私は整数のタプルのリストを持っています。条件付きリストから項目を削除する

ls = [[(a_1, a_2), (b_1, b_2)], [(c_1, c_2), (d_1, d_2), (e_1, e_2)], ...] 

そして、2番目のエントリが所定の整数に等しいタプルを含むlsのすべての項目を削除する必要があります。

私はこの試みた:

for item in ls: 
    for tpl in item: 
     if tpl[1] == m: 
     ls.remove(item) 

をしかし、いくつかの理由で、これが唯一のリスト項目のいくつかが削除されますが、すべての=メートル2番目のエントリでタプルを含みません。

+0

これは、使用しているプログラミング言語でタグ付けする必要があります。 lsはタプルの配列のリストです。つまり、配列を繰り返し処理するためには3番目のループが必要です。 – disperse

答えて

2

リスト内包使用:

ls = [item for item in ls if all(tuple[1] != m for tuple in item)] 

やフィルタを使用します。

ls = filter(lambda item: all(tuple[1] != m for tuple in item),ls) 
+0

'any'を' any'に、 '!='を '='に変更します。フィルター条件がTrueを返すものだけを保持するかどうかは決して覚えていません。 –

0

Pythonでリストをフィルタリングするための最良の方法は、リストの内包表記を使用することです:

filtered = [item for item in ls if not(contains_m(item))] 

そして、あなたが必要とするすべては、例えば、アイテムがmに含まれている場合伝えることができる機能です。

def contains_m(item): 
    return any([tpl[1] == m for tpl in item]) 
0

itmeをリストから削除することは、それを繰り返すうちにはお勧めできません。 (ここではPythonを話しているところならば)

ls = [[('a_1', 'a_2'), ('b_1', 'b_2')], [('c_1', 'c_2'), ('d_1', 'd_2'), ('e_1', 'e_2')]] 

m='c_2' 
print [ x for x in ls if not [ y for y in x if y[1]==m ]] 
0

Pythonのリスト反復子が怠惰であることを試してみてください。これは、リストから項目を削除すると、その項目をスキップすることを意味します。

[1, 2] 
    ^

[1, 1, 2] 
^ 

それは上の要素と移動を削除:インデックス0

[1, 1, 2] 

あなたforループが開始されます。たとえば、あなたが以下のリストからすべてのものを削除したいと言います

この例は、この問題を説明するのに役立ちます。一つの簡単な回避策は、インデックスを使用して後方ループにある:

for ind in range(len(ls)-1, -1, -1): 
    item = ls[ind] 
    for tpl in item: 
     if tpl[1] == m: 
      del ls[ind] 
      break # You can end the inner loop immediately in this case 

もう一つの方法は、反復処理が、元から削除するには、リストのコピーを作成することです。

for item in ls[:]: 
    for tpl in item: 
     if tpl[1] == m: 
      ls.remove(item) 
      break 

最後のアプローチが可能必要な要素のみを含む出力リストを作成することが簡単になりました。これは、リストの理解に最も簡単です。それを行う最善の方法については、@AlexeySmirnovのanswerを参照してください。

1

コードが吸うとそれほど必要はありません。ここではそれほど希少ではありません。

[l for l in ls if m not in [i[1] for i in l]] 
関連する問題