将值列表添加到现有字典列表(性能关键)

问题描述 投票:4回答:3

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

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]}]

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

表现至关重要。

谢谢

python python-3.x
3个回答
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.25s的列表,为0.085s - 大约是for i in range(len(d))方法的两倍。它还具有优于前者的优势 - 尽管在某些情况下它可能是一个缺点 - 因为它更新了字典,您可以在不创建新列表的情况下更新它们的长列表。

我认为值得注意的两件事情:一,不同方法的表现通常会根据数据的确切结构和代码的其余部分而有很大差异;第二,任何给定代码的性能通常都不如你想象的那么重要。在您的代码中,微秒的差异真的很重要吗?或者你在处理数以百万计的词典和秒钟问题?就个人而言,我认为在您的代码或多或少完成之前谈论很多优化通常为时尚早,并且您已经确定它太慢并且您在实际情况下对其进行了分析。


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


1
投票

您可以zip列表中的dicts列表和列表解析列表,其中输出的子序列解压缩,子列表添加到groups键:

d = [{**s, 'groups': g} for s, g in zip(d, l)]
© www.soinside.com 2019 - 2024. All rights reserved.