我需要以最有效的方式帮助将以下列表转换为字典:
l = ['A:1','B:2','C:3','D:4']
目前,我执行以下操作:
mydict = {}
for e in l:
k,v = e.split(':')
mydict[k] = v
但是,我认为应该有一种更有效的方法来实现同样的目标。有什么想法吗?
答案 0 :(得分: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
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}
答案 1 :(得分:1)
>>> dict(map(lambda s: s.split(":"), ["A:1", "B:2", "C:3", "D:4"]))
{'A': '1', 'C': '3', 'B': '2', 'D': '4'}
答案 2 :(得分: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