将值列表添加到现有字典列表中(对性能至关重要)

时间:2019-04-02 02:08:15

标签: python python-3.x

如何添加像这样的值列表:

l = [[1, 2], [2, 3], [3, 4]]

到这样的现有字典列表中:

d = [{'id': 1, 'type': 'normal'},
     {'id': 2, 'type': 'low'},
     {'id': 3, 'type': 'hight'}]

这样最终结果将是这样的:

d = [{'id': 1, 'type': 'normal', 'groups': [1, 2]},
     {'id': 2, 'type': 'low', 'groups': [2, 3]},
     {'id': 3, 'type': 'hight', 'groups': [3, 4]}]

两个列表的大小相同,并且两个列表中的索引必须匹配。

性能至关重要。

谢谢

3 个答案:

答案 0 :(得分:3)

采用不创建任何新列表或字典或使用索引的方法,似乎要快得多。这是我找到的最快的(也是我认为最简单的):

for sub_d, groups in zip(d, l):
    sub_d['groups'] = groups

在我的测试中,这大约是d = [{**s, 'groups': g} for s, g in zip(d, l)]的三倍-1000000字典列表的速度是0.085s,而0.25s是-for i in range(len(d))方法的两倍。与前者相比,它还具有优势-尽管在某些情况下可能是不利的-既然它可以就地更新词典,因此您可以在不创建新列表的情况下更新它们的长列表。

不过,我认为有两点值得注意:第一,通常,不同方法的性能通常会因数据的确切结构和其余代码的不同而有很大差异;第二,任何给定代码的性能通常都没有您想像的那么重要。在您的代码中,微秒的差异真的很关键吗?还是您要处理数百万本词典,几秒钟很重要?我个人认为,在代码或多或少完整之前,谈论很多关于优化的讨论还为时过早,而您已经确定过慢在现实情况下。

答案 1 :(得分:1)

这对我有用:

for i in range(len(d)):
  d[i]["groups"] = l[i]

给我:

[{'id': 1, 'type': 'normal', 'groups': [1, 2]}, {'id': 2, 'type': 'low', 'groups': [2, 3]}, {'id': 3, 'type': 'hight', 'groups': [3, 4]}]

及时:

1.9000000000005124e-05 seconds

答案 2 :(得分:1)

您可以zip字典列表和列表推导中的列表列表,该列表输出带有未打包子字典且将子列表添加到groups键的子字典:

d = [{**s, 'groups': g} for s, g in zip(d, l)]