2016-10-15 28 views
-1

タプルの内容に基づいてリストからタプルを削除しようとしています。この例では、私が何をしようとしているのかを示しています。目的は、第2空間で空の値を持つタプルを削除することです。最終的なリストは、次のようになります。if文を使用してリストからタプルを削除する

i=[(a,0),(c,5)] 

私は、コードを使用してこれを達成しようと試みてきた:

for p in i: 
    if '' in p[1]: 
     i.remove(p) 

私はこの時点でiを印刷する場合は、リストはそれに行って何も変更はありません。どこが間違っていますか?

+2

タプルは不変です。 –

+1

あなたはここにリストがありません。あなたはタプルのタプルを持っています。 –

+1

'i'が' list'だったとしても、やっていることは悪い考えです。 [コンテナの反復処理中にコンテナを変更しないでください(http://stackoverflow.com/questions/36191418/why-cant-i-duplicate-selected-items-in-for-loop)。 –

答えて

0

あなたはそれに言及していませんでしたが、おそらくTypeError: argument of type 'int' is not iterableの例外が発生しています。問題は'' in 5が全く意味をなさないことです。代わりにif p[1] == ''を使用します。

もう1つの問題は、反復処理中にリストから要素を正しく削除できないことです。

可能な解決策は、リストの内包を使用することである。

i = [p for p in i if p[1] != ''] 
0

タプルの各部材の第2の要素は、(少なくとも最初と最後のタプルのための)反復可能ではないので、あなたは使用できません」その場合には「in」である。

i = filter(lambda x: x[1] != '', [(a,0), (b,''), (c,5)] 

以上である:最も可能性の高いあなたは、私が前に述べた問題、あなたはそのようなことをCANDOを修正する場合は、あなたの「if」文は、

if p[1] == '': 

そして最後のようなものであるということですそれを行うpythonic方法

+0

ラムダを使用するのは確かにリストのcompよりもピギーソニックではありません。また、名前を再割り当てすることは、他の参照がある場合は元のリストを更新することと同じではありません。フィルタはpython3を使ってリストを返すこともありません。 –

+0

"もっとpythonic"では、私はopの "for"アプローチを指していました。リストcompは良い考えですが、私はFrancisco Couzoと私が同時に答えを書いたと思います。私はPy3のフィルタについて調べますが、その動作が変わったことはわかりませんでした。 – JoseLSegura

+1

OPのアプローチはまったく間違っていますが、実際にはすべての文字列に空の文字列が含まれていると言われるので、実際には ""で斜めになっています。 –

関連する問題