以前伺ってすごくいい問題だと思いましたので、紹介させていただきます。内容は1つのリストから複数の要素をインデックスを指定して取り除く方法についてです。つまり、以下のようなことができないかという問題でした。

>>> lst = ["a", "b", "c", "d", "e", "f", "g", "h"]
>>> lst.pop([2, 4, 5]) # これは出来ない!
['c', 'e', 'f']
>>> lst
['a', 'b', 'd', 'g', 'h']

残念ながらpop()にはインデックスを1つしか指定できないので、上記のコードは実行できません。そこで、1つずつ取り除く必要がありますが、順序をよく考えないと思い通りになりません。

以下で、うまく取り除けないケースとその解決方法を考えてみます。

順序通り取り除けないコード

>>> lst = ["a", "b", "c", "d", "e", "f", "g", "h"]
>>> pop_lst = [2, 4, 5]
>>> for i in pop_lst:
        lst.pop(i)

'c'
'f'
'h'
>>> lst
['a', 'b', 'd', 'e', 'g']
# ['a', 'b', 'd', 'g', 'h']が正解のはず...

うまく行かない原因はインデックスを小さい方から取り除いたため、2回目以降のpop()でズレてしまったからです。この問題を回避するには、インデックスが大き方から実行する必要があります。

解決方法

そこで、以下のように、取り除くインデックスのリストをsorted(reverse=True)で降順に並び替えてからループさせます。

>>> lst = ["a", "b", "c", "d", "e", "f", "g", "h"]
>>> pop_lst = [2, 4, 5]
>>> for i in sorted(pop_lst, reverse=True):
        lst.pop(i)

'f'
'e'
'c'
>>> lst
['a', 'b', 'd', 'g', 'h']

結果を見れば何でもない問題ですが、初めて思いつくのはそれなりに考えます。このような問題の解決法を思いついた時の快感もプログラミングの醍醐味の一つです。