1. ホーム
  2. python

[解決済み] Pythonでリスト内の値を置換する【重複あり

2022-04-24 09:17:41

質問

リストがあり、condition()がTrueを返す値をNoneに置き換えたいのですが。

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

例えば、条件チェックでbool(item%2)が返ってくるようにします。

[None, 1, None, 3, None, 5, None, 7, None, 9, None]

最も効率的な方法は何でしょうか?

どのように解決するのですか?

リスト内包で新しいリストを構築する。

new_items = [x if x % 2 else None for x in items]

必要であれば、元のリストをインプレースで修正することができますが、実際には時間の節約にはなりません。

items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for index, item in enumerate(items):
    if not (item % 2):
        items[index] = None

以下は、(Python 3.6.3) タイムセーブを行わない場合のタイミングです。

In [1]: %%timeit
   ...: items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
   ...: for index, item in enumerate(items):
   ...:     if not (item % 2):
   ...:         items[index] = None
   ...:
1.06 µs ± 33.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [2]: %%timeit
   ...: items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
   ...: new_items = [x if x % 2 else None for x in items]
   ...:
891 ns ± 13.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

そして、Python 2.7.6のタイミング。

In [1]: %%timeit
   ...: items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
   ...: for index, item in enumerate(items):
   ...:     if not (item % 2):
   ...:         items[index] = None
   ...: 
1000000 loops, best of 3: 1.27 µs per loop
In [2]: %%timeit
   ...: items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
   ...: new_items = [x if x % 2 else None for x in items]
   ...: 
1000000 loops, best of 3: 1.14 µs per loop