2013-05-04 40 views
5

我需要幫助以最有效的方式向下面的列表轉換成詞典:高效的方式轉換成一個列表,字典

l = ['A:1','B:2','C:3','D:4'] 

目前,我做了以下內容:

mydict = {} 
for e in l: 
    k,v = e.split(':') 
    mydict[k] = v 

不過,我相信應該有一個更有效的方法來實現。任何想法 ?

+4

我相信沒有什麼比這更有效。請記住,「更少的行」與「更快」不一樣。這一切歸結爲語言如何擴展這些線。 – LtWorf 2013-05-04 13:03:44

+0

我的比較答案已更新,比較短(4項),長(13312項)和非常長(27262976項)列表的相關答案。 – FallenAngel 2013-05-04 15:00:46

回答

12

使用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} 
+0

@LWWorf'x在lis'中的x.split(「:」)是一個生成器表達式,而不是一個列表理解。因此它不分配臨時數據結構 – Kos 2013-05-04 13:04:58

+0

是的,我的錯誤,對不起。無論如何,這不是更有效率。一樣的。 – LtWorf 2013-05-04 13:05:42

+1

@LtWorf閱讀本文:http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Loops LC和生成器表達式比其for循環版本更快。 – 2013-05-04 13:07:11

0

我想這是最好的執行時間比較他們......

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 
+0

但是對於幾乎所有的應用程序,我仍然更喜歡第2種情況,因爲它更明顯地表明您正在做什麼。 – poke 2013-05-04 13:41:14

+0

你是否也對較大的數據集有一些結果? – inf 2013-05-04 13:41:42

+0

@poke也許,但這裏的問題是_efficiency_,而不是可讀性。 – FallenAngel 2013-05-04 13:42:44

1
>>> dict(map(lambda s: s.split(":"), ["A:1", "B:2", "C:3", "D:4"])) 
{'A': '1', 'C': '3', 'B': '2', 'D': '4'}