Quantcast
Channel: dictionaryタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 99

pythonで逆辞書を作る最速の方法は?

$
0
0

TL;DR

pythonのdictのkey,valueを逆にしたものを生成したい場合は、以下が最速。

d=dict(zip(list('abc'),range(3)))# 例として適当な辞書を生成
d2=dict(zip(d.values(),d.keys()))# 逆

本題

pythonを書いていると、既存のdictのkey,valueを逆にしたものを生成したい場合があったりします。例えば、

{'a':0,'b':1,'c':2}

に対する

{0:'a',1:'b',2:'c'}

です。そこで、逆版を最速で得るやり方を幾つか試してみました。

準備

d=dict(zip([f'key{i}'foriinrange(10000)],range(10000)))# 適当な辞書

1. forループ

%%timeit
d2 = dict()
for k in d:
    d2[d[k]] = k

結果: 1.09 ms ± 57.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

2. zipで値とキーを結合

%timeitdict(zip(d.values(),d.keys()))

結果: 525 µs ± 21.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

3. 辞書内包表記

%timeit{v:kfork,vind.items()}

結果: 661 µs ± 23 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

結果

結果、2. zipで値とキーを結合 が最速となりました。pythonの内部の挙動は不勉強でよく分かりませんが、forループが効いているように感じます。pythonのforループは一回ごとに型チェックが入るので遅い、というのは色々な所で指摘されています。

ただ、2位である辞書内包表記とあまり差がないので、()のネストが深い分可読性が落ちることを考慮して、3.でも良いかも知れません。

以上。


Viewing all articles
Browse latest Browse all 99

Trending Articles