私のコードは、リストの最後の空の要素を削除しないのはなぜですか?リストから空の要素をすべて削除する
templist = ['', 'hello', '', 'hi', 'mkay', '', '']
for element in templist:
if element == '':
templist.remove(element)
print (templist)
出力:
['hello', 'hi', 'mkay', '']
私のコードは、リストの最後の空の要素を削除しないのはなぜですか?リストから空の要素をすべて削除する
templist = ['', 'hello', '', 'hi', 'mkay', '', '']
for element in templist:
if element == '':
templist.remove(element)
print (templist)
出力:
['hello', 'hi', 'mkay', '']
リストのコピーを反復することにより、自分の誤りを指摘して、すなわちにごfor
文を変更する:あなたしながら、リストを変更
for element in templist[:]:
それを繰り返すと、あなたが見る奇妙な結果につながります。
はよりコンパクトに、あなたはこのためにfilter
を使用することができます。None
がそれに供給されたとき
templist = list(filter(None, templist))
、それは単に(空の文字列がfalseに評価)真である要素を返します。
あなたはwordGrabber
例えば、代わりにあなたがコンテンツを使用して新しいリストを作成することができ空白を除去すると呼ばれる新しいリストを作ることができ
templist = ['', 'hello', '', 'hi', 'mkay', '', '']
for element in templist:
if element != '':
wordGrabber.append(element)
print (wordGrabber)
回答の[コードの書式設定方法](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)を参照してください。私はコードがフォーマットされるようにあなたの答えを編集しました。 –
反復処理中のリストを変更しているためです。あたかもforループがインデックスを使って繰り返しているかのように考えることができます。要素を削除するとリストの長さが短くなり、インデックス>len(list) - 1
が無効になります。
これまで「Python的」ソリューションは、リストの内包表記を使用することです:
templist = ['', 'hello', '', 'hi', 'mkay', '', '']
templist[:] = [item for item in templist if item != '']
これは、代わりにリストから項目の除去を行います。
)これはダブです。 B) '[アイテムの場合は、templistのアイテムのアイテム]'で十分です。空の文字列はfalseと評価されます。 – TemporalWolf
@TemporalWolf:A)何のdupですか? B)私は、 'None'、0、' False'と評価される他の項目を削除することを前提にしたくありませんでした。 OPの「空要素」 - 「0」と「なし」は、空ではありません。 – mhawke
@TemporalWolf:オハイオ州私は、質問は、この答えではないdupを参照してください。この答えはその質問で受け入れられた答えとは異なります(それは置き換えで言及します)。概念は同じですが空のリストではなく空の文字列に関係します。 – mhawke
'templist = [xの場合、xはtemplistでx!= '']'または 'templist = list(filter(None、templist))'です。元のリストを変更する場合は、 'templist [:]'に割り当てます。 –
質問は重複しているとマークされましたが、ここで私の答え(説明があなたのコードが機能しない理由)を見つけることができます:https://gist.github.com/ischurov/028f2636c97f1e1a83f04ff10332a04d –