2016-11-14 20 views
1

私のコードは、リストの最後の空の要素を削除しないのはなぜですか?リストから空の要素をすべて削除する

templist = ['', 'hello', '', 'hi', 'mkay', '', ''] 

for element in templist: 
    if element == '': 
     templist.remove(element) 

print (templist) 

出力:

['hello', 'hi', 'mkay', ''] 
+0

'templist = [xの場合、xはtemplistでx!= '']'または 'templist = list(filter(None、templist))'です。元のリストを変更する場合は、 'templist [:]'に割り当てます。 –

+1

質問は重複しているとマークされましたが、ここで私の答え(説明があなたのコードが機能しない理由)を見つけることができます:https://gist.github.com/ischurov/028f2636c97f1e1a83f04ff10332a04d –

答えて

0

リストのコピーを反復することにより、自分の誤りを指摘して、すなわちにごfor文を変更する:あなたしながら、リストを変更

for element in templist[:]: 

それを繰り返すと、あなたが見る奇妙な結果につながります。

はよりコンパクトに、あなたはこのためにfilterを使用することができます。Noneがそれに供給されたとき

templist = list(filter(None, templist)) 

、それは単に(空の文字列がfalseに評価)真である要素を返します。

2

さて、あなたは常にだけでこれを行うことができます:

new_list = list(filter(None, templist)) 
+1

これは、 ' Clone

0

あなたはwordGrabber例えば、代わりにあなたがコンテンツを使用して新しいリストを作成することができ空白を除去すると呼ばれる新しいリストを作ることができ

templist = ['', 'hello', '', 'hi', 'mkay', '', ''] 

for element in templist: 
    if element != '': 
     wordGrabber.append(element) 

print (wordGrabber) 
+0

回答の[コードの書式設定方法](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)を参照してください。私はコードがフォーマットされるようにあなたの答えを編集しました。 –

6

反復処理中のリストを変更しているためです。あたかもforループがインデックスを使って繰り返しているかのように考えることができます。要素を削除するとリストの長さが短くなり、インデックス>len(list) - 1が無効になります。

これまで「Python的」ソリューションは、リストの内包表記を使用することです:

templist = ['', 'hello', '', 'hi', 'mkay', '', ''] 
templist[:] = [item for item in templist if item != ''] 

これは、代わりにリストから項目の除去を行います。

+0

)これはダブです。 B) '[アイテムの場合は、templistのアイテムのアイテム]'で十分です。空の文字列はfalseと評価されます。 – TemporalWolf

+2

@TemporalWolf:A)何のdupですか? B)私は、 'None'、0、' False'と評価される他の項目を削除することを前提にしたくありませんでした。 OPの「空要素」 - 「0」と「なし」は、空ではありません。 – mhawke

+1

@TemporalWolf:オハイオ州私は、質問は、この答えではないdupを参照してください。この答えはその質問で受け入れられた答えとは異なります(それは置き換えで言及します)。概念は同じですが空のリストではなく空の文字列に関係します。 – mhawke

関連する問題