簡體   English   中英

將列表轉換為字典的有效方法

[英]Efficient way to convert a list to dictionary

我需要以最有效的方式幫助將以下列表轉換為字典:

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}
>>> dict(map(lambda s: s.split(":"), ["A:1", "B:2", "C:3", "D:4"]))
{'A': '1', 'C': '3', 'B': '2', 'D': '4'}

我想最好按執行時間比較它們......

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM