次のリストを辞書に変換する最も効率的な方法を教えてください。
l = ['A:1','B:2','C:3','D:4']
現在、私は次のことを行っています。
mydict = {}
for e in l:
k,v = e.split(':')
mydict[k] = v
ただし、同じことを達成するためのより効率的な方法があるはずだと思います。何か案が ?
次のリストを辞書に変換する最も効率的な方法を教えてください。
l = ['A:1','B:2','C:3','D:4']
現在、私は次のことを行っています。
mydict = {}
for e in l:
k,v = e.split(':')
mydict[k] = v
ただし、同じことを達成するためのより効率的な方法があるはずだと思います。何か案が ?
dict()
ジェネレーター式で使用します。
>>> lis=['A:1','B:2','C:3','D:4']
>>> dict(x.split(":") for x in lis)
{'A': '1', 'C': '3', 'B': '2', 'D': '4'}
dict-comprehension の使用 (@PaoloMoretti の提案による):
>>> {k:v for k,v in (e.split(':') for e in lis)}
{'A': '1', 'C': '3', 'B': '2', 'D': '4'}
10**6 アイテムのタイミング結果:
>>> from so import *
>>> %timeit case1()
1 loops, best of 3: 2.09 s per loop
>>> %timeit case2()
1 loops, best of 3: 2.03 s per loop
>>> %timeit case3()
1 loops, best of 3: 2.17 s per loop
>>> %timeit case4()
1 loops, best of 3: 2.39 s per loop
>>> %timeit case5()
1 loops, best of 3: 2.82 s per loop
so.py:
a = ["{0}:{0}".format(i**2) for i in xrange(10**6)]
def case1():
dc = {}
for i in a:
q, w = i.split(':')
dc[q]=w
def case2():
dict(x.split(":") for x in a)
def case3():
{k:v for k,v in (e.split(':') for e in a)}
def case4():
dict([x.split(":") for x in a])
def case5():
{x.split(":")[0] : x.split(":")[1] for x in a}
実行時間で比較したほうがいいと思います...
a = ['A:1','B:2','C:3','D:4']
def case1():
dc = {}
for i in a:
q, w = i.split(':')
dc[q]=w
def case2():
dict(x.split(":") for x in a)
def case3():
{x.split(":")[0] : x.split(":")[1] for x in a}
%timeit -n 100000 case1()
>> 100000 loops, best of 3: 1.95 us per loop
%timeit -n 100000 case2()
>> 100000 loops, best of 3: 3.05 us per loop
%timeit -n 100000 case3()
>> 100000 loops, best of 3: 3.39 us per loop
ループに対してテスト100.000
され、ループごとに 3 つのテストが行われます。;ご覧のとおり、最速の実行時間はcase1()
: standardに属しfor loop
ます。
結果: 1 つのライナー メソッドが高速であることを意味するわけではありません。実際、基本的なfor
ループが一般的に最速の方法です。
更新: 13312 項目のリストの結果、基本リストには 26 項目があり、残りはリスト内の項目のコピーです。タイミングは 1000 ループにわたって計算され、ループごとにベスト オブ 3
%timeit -n 1000 case3()
1000 loops, best of 3: 9.49 ms per loop
%timeit -n 1000 case2()
1000 loops, best of 3: 5.79 ms per loop
%timeit -n 1000 case1()
1000 loops, best of 3: 5.55 ms per loop
更新 2:最終テストは、27262976
合計アイテムのリストで行われます。基本リストには 26 のアイテムがあり、残りはリスト内のアイテムのコピーです。タイミングは 10 ループにわたって計算され、ループごとに 3 つのベストが計算されます (非常に長いリストの実行には非常に時間がかかるため)。
%timeit -n 10 case1()
10 loops, best of 3: 11.4 s per loop
%timeit -n 10 case2()
10 loops, best of 3: 12.1 s per loop
%timeit -n 10 case3()
10 loops, best of 3: 20.2 s per loop