我有list
个列表,例如mylist=[[1,2,3],[4,5,6],[7,8,9],...]
,我想填充list
dict
个dlist[0]['area']=1
dlist[0]['volume']=2
dlist[0]['height']=3
dlist[1]['area']=4
dlist[1]['volume']=5
,其中dicts的值来自嵌套列表,例如
dlist = [{'area':mylist[i][0], 'volume':mylist[i][1], 'height':mylist[i][2]} for i in range(len(mylist)]
等
到目前为止,我有:
len(mylist)
我的列表在第一维中可能非常大(即zip
可能非常大)。有没有比这个列表理解更快的方法?也许有Auth::user()->id;
的东西?
答案 0 :(得分:5)
您可以在zip
理解中使用list
:
<强>代码:强>
keys = ('area', 'volume', 'height')
output = [dict(zip(keys, l)) for l in mylist]
数据:强>
mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
<强>结果:强>
[{'volume': 2, 'height': 3, 'area': 1},
{'volume': 5, 'height': 6, 'area': 4},
{'volume': 8, 'height': 9, 'area': 7}]
但如果您想要比原始解决方案更快:
然后跳过zip
,在原始list
上使用迭代,直接构建dict
:
output = [{'area': i[0], 'volume': i[1], 'height': i[2]} for i in mylist]
时间码:
import timeit
mylist = [[1, 2, 3]] * 100000
def method1():
keys = ('area', 'volume', 'height')
return [dict(zip(keys, i)) for i in mylist]
def method2():
return [{
'area': mylist[i][0],
'volume': mylist[i][1],
'height': mylist[i][2]
} for i in range(len(mylist))]
def method3():
return [{'area': i[0], 'volume': i[1], 'height': i[2]} for i in mylist]
print(timeit.repeat("method1()", "from __main__ import method1", number=10))
print(timeit.repeat("method2()", "from __main__ import method2", number=10))
print(timeit.repeat("method3()", "from __main__ import method3", number=10))
时间安排结果:
邮编:
[1.192184281360701, 1.7045185775655127, 1.2134081278821043]
原件:
[0.38957559529443664, 0.38713287436332866, 0.3920681133687083]
迭代列表,直接构建dict:
[0.2965552921248671, 0.28165834370140264, 0.29972900470716013]