gpt4 book ai didi

python - 从大量字典创建字典的最快方法

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:47 25 4
gpt4 key购买 nike

我需要从一个大的字典列表中创建一个字典,删除所有重复的字典

输入列表是这样的:

input = [{'id': 1, 'value1': 'value1', 'value2': 'value2'},{'id': 2, 'value1': 'value1', 'value2': 'value2'}, {'id': 2, 'value1': 'value1', 'value3': 'value4'}]

我想创建一个这样的字典,使用“id”值作为新字典的键:

output = {
1: [{'id': 1, 'value1': 'value1', 'value2': 'value2'}]
2: [{'id': 2, 'value1': 'value1', 'value2': 'value2'}, {'id': 2, 'value1': 'value1', 'value3': 'value4'}]
}

我的第一次尝试是:

    output = {}
for el in input:
if el['id'] not in output or el not in output[el['id']]:
output.setdefault(el['id'], []).append(el)

它确实有效,但它非常慢,len(input) 大约是 20k/30k 项目

有没有其他方法可以更快一点?

谢谢!

最佳答案

使用一个单独的集合来跟踪看到的词典;您必须先将它们转换为可散列的表示形式:

seen = set()
drepr = lambda d: tuple(sorted(d.items()))

output = {}
for el in input:
if drepr(el) not in seen:
output.setdefault(el['id'], []).append(el)
seen.add(drepr(el))

您可以使用 collections.defaultdict object 来稍微加快速度因为这将具体化列表而无需查找方法并推送堆栈框架来调用它:

from collections import defaultdict

seen = set()
drepr = lambda d: tuple(sorted(d.items()))

output = defaultdict(list)

for el in input:
if drepr(el) not in seen:
output[el['id']].append(el)
seen.add(drepr(el))

演示:

>>> input = [{'id': 1, 'value1': 'value1', 'value2': 'value2'},{'id': 2, 'value1': 'value1', 'value2': 'value2'}, {'id': 2, 'value1': 'value1', 'value3': 'value4'}]
>>> seen = set()
>>> drepr = lambda d: tuple(sorted(d.items()))
>>> output = {}
>>> for el in input:
... if drepr(el) not in seen:
... output.setdefault(el['id'], []).append(el)
... seen.add(drepr(el))
...
>>> from pprint import pprint
>>> pprint(output)
{1: [{'id': 1, 'value1': 'value1', 'value2': 'value2'}],
2: [{'id': 2, 'value1': 'value1', 'value2': 'value2'},
{'id': 2, 'value1': 'value1', 'value3': 'value4'}]}

关于python - 从大量字典创建字典的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21859781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com