我需要幫助以最有效的方式向下面的列表轉換成詞典:高效的方式轉換成一個列表,字典
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'}
使用字典-理解(由@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()
:標準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
但是對於幾乎所有的應用程序,我仍然更喜歡第2種情況,因爲它更明顯地表明您正在做什麼。 – poke 2013-05-04 13:41:14
你是否也對較大的數據集有一些結果? – inf 2013-05-04 13:41:42
@poke也許,但這裏的問題是_efficiency_,而不是可讀性。 – FallenAngel 2013-05-04 13:42:44
>>> dict(map(lambda s: s.split(":"), ["A:1", "B:2", "C:3", "D:4"]))
{'A': '1', 'C': '3', 'B': '2', 'D': '4'}
我相信沒有什麼比這更有效。請記住,「更少的行」與「更快」不一樣。這一切歸結爲語言如何擴展這些線。 – LtWorf 2013-05-04 13:03:44
我的比較答案已更新,比較短(4項),長(13312項)和非常長(27262976項)列表的相關答案。 – FallenAngel 2013-05-04 15:00:46