0

リストからすべての空の文字列を削除しようとしているときに、興味深い不可解な状況に遭遇しました。初めて以下のコードを書きました。

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 演算子を使用する際に知っておくべきことはありますか?

4

2 に答える 2

2

反復しているループ中に何かを削除すると、このような奇妙な結果が得られます。スライスを繰り返し処理する[:]と、文字列が消えなくなります

for item in lst[:]:

反復に影響を与えずにリストの要素を操作できるように、反復するコピーを作成します

この投稿では、リストを繰り返し処理しながらリストを変更するとどうなるかについて説明します。

于 2013-06-27T23:10:49.153 に答える