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

3
我有一个嵌套列表的列表,例如: mylist=[[1,2,3],[4,5,6],[7,8,9],...],我想填充一个dict的列表,其中dict的值来自于嵌套的列表,例如:
dlist[0]['area']=1
dlist[0]['volume']=2
dlist[0]['height']=3
dlist[1]['area']=4
dlist[1]['volume']=5

etc.

So far I have:

dlist = [{'area':mylist[i][0], 'volume':mylist[i][1], 'height':mylist[i][2]} for i in range(len(mylist)]

我的列表在第一维度上可能非常大(即len(mylist)可能非常大)。有没有比这个列表推导更快的方法?也许使用zip可以?

1个回答

7
您可以在列表推导式中使用 `zip`: 代码:
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]

Original:

[0.38957559529443664, 0.38713287436332866, 0.3920681133687083]

在列表上迭代,直接构建字典:

[0.2965552921248671, 0.28165834370140264, 0.29972900470716013]

整洁,谢谢,但是这比原来的运行速度慢了一些。 - DanB
使用更快的方法进行编辑,而不是使用 zip - Stephen Rauch
方法三获胜,比我之前的风格和性能更好。谢谢! - DanB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接