0
    print difflist
    for line in difflist:
        if ((line.startswith('<'))or (line.startswith('>')) or (line.startswith('---'))):
            difflist.remove(line)
    print difflist

ここで、当初、

difflist = ['1a2', '> ', '3c4,5', '< staring', '---', '> starring', '> ', '5c7', '< at ', '---', '> add ', '']

そして、私がコードに期待するのは印刷することです

['1a2', '3c4,5', '5c7', '']

しかし、代わりに得られるのは

difflist= ['1a2', '3c4,5', '---', '> ', '5c7', '---', '']
4

6 に答える 6

1

代わりにこれを行います:

>>> difflist = [i for i in difflist if not i.startswith(('<','>','---'))]
>>> difflist
['1a2', '3c4,5', '5c7', '']

実行すると順序が変更されるため、(ちょ.remove()​​っと) for ループが台無しになります。詳細については、mgilson の回答をご覧ください。

于 2013-04-17T23:25:09.883 に答える
0

リストからアイテムを削除しようとする代わりに、何もせずに、必要なもので別のリストを作成します。

array = []
for line in difflist:
    if ((line.startswith('<'))or (line.startswith('>')) or (line.startswith('---'))):
        pass
    else:
        array.append(line)

これで array が探している配列になります!

于 2013-04-17T23:25:25.203 に答える
0

何が起こっているかについて「異常」は何もありません。実際、それはごく普通のことです。何が起こっているかは次のとおりです。

  1. ループはアイテムiを見ています。
  2. アイテムiはあなたのテストを満たしているので、削除します。item i+1は item iになりました。
  3. ループが再び開始され、反復子は項目i+1を指すように進みますが、新しい項目iはテストされません。

考えられる解決策がいくつかあります。

  1. 既存のリストからアイテムを削除するのではなく、必要なアイテムのみを含む新しいリストを作成します。これはアルゴリズムの複雑さが改善され、Python での効率も向上しますが、より多くのメモリを使用する可能性があります。
  2. リストを逆順に繰り返します。このようにして、すでに見たアイテムのみをシフトします。
  3. リストのコピーを反復処理します。
  4. の代わりに内部whileループを使用しますif

この問題の場合、解決策 4 は次のようになります。

for i, line in enumerate(difflist):
    while line.startswith(('<', '>', '---')):
        difflist.pop(i)
        line = difflist[i]

このようにして、テストに失敗するまで同じインデックスを調べ続け、失敗した場合にのみ反復子が次のインデックスに移動できるようにします。

remove(私はあなたの条件にある余分な不要な括弧を削除するだけでなく、あなたをに変更する自由を取りましたpop--remove毎回リストの先頭から検索する必要があり、ループをシュレミエル・ザ・ペインターのアルゴリズムにします)。

あなたが調べることができるもう1つのことは、dequecollectionsモジュールから)を使用することです。これはリンクされたリスト (通常の Pythonlistは実際にはサイズ変更可能な配列です) であり、そこから要素を削除する方がいくらか高速です。

于 2013-04-17T23:25:57.180 に答える