5

我需要以最有效的方式将以下列表转换为字典的帮助:

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

目前,我执行以下操作:

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

但是,我相信应该有一种更有效的方法来实现这一目标。任何想法 ?

4

3 回答 3

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'}

使用 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

所以.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}
于 2013-05-04T12:57:04.787 回答
1
>>> dict(map(lambda s: s.split(":"), ["A:1", "B:2", "C:3", "D:4"]))
{'A': '1', 'C': '3', 'B': '2', 'D': '4'}
于 2013-05-04T13:34:40.160 回答
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 liner 方法并不意味着它们更快,实际上基本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
于 2013-05-04T13:29:58.760 回答