Python で list を条件をつけて要素を削除したい。

もちろん list.remove 関数はありますが
条件をつけて削除したい場合にはこんな感じで。

1. list comprehension

def remove_equal(lst, v):
    new_lst = [e for e in lst if e != v]
    lst.clear()
    lst.extend(new_lst)
    del new_lst

これがオススメ。最速だし記述短くて済む。

2. list comprehension(SyntaxError: invalid syntax)

def remove_equal()
    [del lst[i] for i, e in reversed(list(enumerate(lst))) if e == v]

これは invalid syntax, del statement は書けないみたい..
確かに del は文だから del lst[i] は None も何も返さないもんな...
list 内包表記で one liner で行けるかなと思ったのですがダメでした。

3. for statement

def remove_equal(lst, v):
  # 先頭から削除すると list の順序が崩れるので reversed して
  # 後方から削除する。
  for i, e in reversed(list(enumerate(lst))):
    if e == v:
      del lst[i]

4. filter

def remove_equal_filter(lst, v):
    new_lst = list(filter(lambda x: x != v, lst))
    lst.clear()
    lst.extend(new_lst)
    del new_lst

5. while statement

頑張って書いたのに遅い。

def remove_equal(lst, v):
    new_lst = []
    while True:
        try:
            e = lst.pop()
        except IndexError:
            break
        if e == v:
            del e
        else:
            new_lst.append(e)
    new_lst.reverse()
    lst.extend(new_lst)
    del new_lst

◯ 実行時間の比較

1, 3, 4, 5 の順に速い。
速度の比較に使ったコードはこちら

項番 名前 時間
1 list comprehension 1.4513023380004597
2 list comprehension N/A
3 for statement 1.8976071110000703
4 filter 2.7723725119976734
5 while statement 3.503575995999199