Python - 如何从现有列表中填充字典列表

时间:2017-03-31 05:54:14

标签: python dictionary list-comprehension

我有list个列表,例如mylist=[[1,2,3],[4,5,6],[7,8,9],...],我想填充list dictdlist[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;的东西?

1 个答案:

答案 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]