反转大型JSON字典

3

我有一个包含多个条目(大约8百万)的JSON字典,每个条目的形式如下:

{"Some_String": {"Name0": 1, "Name1": 1, "Name42": 2, "Name5": 2, ... }, ...}

它包含了用于引用离散命名实体的字符串,以及该名称被该字符串引用的次数。
我想反转映射,使得Name0后面跟随引用它的字符串(保持计数)。一个名称可能会出现在多个字符串条目中。
{"Name0": {"Some_String": 1, "Some_other_string": 1,... }, ...}

我的问题是:是否有一些JSON功能可以让我有效地完成这个任务?
我的天真的方法涉及将每个名称添加到一个二维数组中(在找到字符串和计数后将其添加到该数组中)。
最初,这运行得非常快,但随着数组大小的增加,运行时间减少(线性搜索)。
for string in list(surface.keys()):

    for count, name in zip(surfacs[string].values(),surface[string].keys()):

        if name in pages:
            surface_count_list[pages.index(name)].append([string, count])


        else:
            pages.append(name)
            surface_count_list.append([string, count])

我意识到我可以直接将这些数据添加到一个新的字典中,但我不确定这样做是否会在字典大小增加时真正提高添加新项的效率。
谢谢。

1
这将是一个完美的情况,可以将您的JSON数据放入关系型数据库中。 - Tomalak
JSON只是一种序列化格式,一种将数据描述为文本的方式。实际上并没有任何“JSON功能”可以更改数据。 - RemcoGerlich
这是Python 2还是3? - RemcoGerlich
@RemcoGerlich Python 3。我认为可能没有这样的功能,因为我自己查找了一下,希望有一种更符合Python风格的方法来实现我尝试过的操作,以提高效率。 - Lee
如果这是一个严格的1:n关系,那么是的。我不太了解OP的数据;三个表的设置可以涵盖1:n和m:n,并且它支持前向和反向查询,同样容易。 - Tomalak
显示剩余3条评论
1个回答

0

类似于

from collections import defaultdict
result = defaultdict(dict)

for somestring, namesdict in initialdata.items():
    for name, amount in namesdict.items():
        result[name][something] = amount

可以这样做,但是如果有800万个项目,可能需要考虑使用数据库。

谢谢,我可能会研究一下数据库。 - Lee

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