リストからすべての空の文字列を削除しようとしているときに、興味深い不可解な状況に遭遇しました。初めて以下のコードを書きました。
lst=['###','','@@@','','$$$','','','%%%','','&&&']
print "len:",len(lst)
iteration=1
for item in lst:
print iteration,":",lst,":",len(lst),":","'%s'"%item
if item!='':
pass
else:
lst.remove(item)
iteration+=1
次の出力が生成されます。
len: 10
1 : ['###', '', '@@@', '', '$$$', '', '', '%%%', '', '&&&'] : 10 : '###'
2 : ['###', '', '@@@', '', '$$$', '', '', '%%%', '', '&&&'] : 10 : ''
3 : ['###', '@@@', '', '$$$', '', '', '%%%', '', '&&&'] : 9 : ''
4 : ['###', '@@@', '$$$', '', '', '%%%', '', '&&&'] : 8 : ''
5 : ['###', '@@@', '$$$', '', '%%%', '', '&&&'] : 7 : '%%%'
6 : ['###', '@@@', '$$$', '', '%%%', '', '&&&'] : 7 : ''
注: コードは正常に動作しません。出力にいくつかの空の文字列があります。後で、次のようなより良い方法を見つけました: リスト内包表記:[x for x in lst if x!='']
または、新しいリストを作成して空でない文字列をそれにコピーします。これは、要素を削除するたびに位置をシフトする必要がないため、上記のコードよりも効率的です。リスト。
ただし、上記のコードの出力に関していくつか質問があります。
最初の質問は、元のリストの長さが 10 であるため、ループが 10 回実行されないのはなぜですか (反復回数は左端にあります)。次に、一番右の列を見ると、文字列が印刷されていないことがわかります@@@
。それは完全にそれをスキップします!! 私の理論では、in
演算子はインデックスのシュガー(おそらく)であるため、リストの長さが変わってもインデックスは1ずつ増加し続けます。i
これにより、3 回目の反復で の値が空の文字列であり、@@@
以降のlst[2]
is ではない理由が説明されます''
。
in 演算子を使用する際に知っておくべきことはありますか?