0

最近、ここで質問しました: int が配列の配列にあるかどうかを調べるにはどうすればよいですか? そして解決策はうまくいきます。別の配列に int が含まれていない場合に配列から int を削除するコードを作成しようとしています。私が使用しようとしているループは次のとおりです。

for index in range(len(numbers)):
    if not any(numbers[index] in elem[:2] for elem in numbers2):
        numbers.remove(numbers[index])

numbers = [1, 2, 4]そしてnumbers2 = [[4,5,6], [2,8,9]]、ループの後、numbers[] は である必要がありますnumbers = [2, 4]。ただし、上記のループはエラーを生成し続けますexceptions.IndexError: list index out of rangeが、エラーがスローされ続ける理由がわかりません。誰でもこの問題を解決できますか?

4

2 に答える 2

4

問題はlen(numbers)、ループの開始時に一度だけ評価されることです。

全体を次のように書き直します。

In [12]: numbers = [1, 2, 4]

In [13]: numbers2 = [[4,5,6], [2,8,9]]

In [15]: n2s = set(reduce(operator.add, (n[:2] for n in numbers2)))

In [17]: [n for n in numbers if n in n2s]
Out[17]: [2, 4]
于 2013-02-13T16:50:13.120 に答える
1

一時リストを作成し、削除する位置を保存してから、すべての反復が完了したら、それらの位置のアイテムを削除します。削除中にインデックス番号を保持するために、逆の順序で削除することを忘れないでください。

to_remove = []
for index, number in enumerate(numbers):
    if not any(number in elem[:2] for elem in numbers2):
        to_remove.append(index)
for index in reversed(to_remove):
    del numbers[index]
于 2013-02-13T16:54:57.433 に答える