Инвертирование большого JSON-словаря

#python #arrays #json #dictionary

#python #массивы #json #словарь

Вопрос:

У меня есть словарь JSON, содержащий несколько записей (примерно 8 миллионов) следующего вида:

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

Он содержит строки, которые использовались для ссылки на отдельные именованные объекты, а также подсчеты того, сколько раз на это имя ссылалась эта строка.

Я хочу инвертировать отображение так, чтобы за Name0 следовали строки, которые ссылались на него (сохраняя количество). Имя, вероятно, будет отображаться в нескольких строковых записях.

 {"Name0": {"Some_String": 1, "Some_other_string": 1,... }, ...}
 

Мой вопрос: есть ли какая-то функциональность JSON, которая позволит мне эффективно это делать?

Мой наивный подход включает добавление каждого имени в 2D-массив (добавление строк и чисел в этот массив по мере их нахождения).

Первоначально это выполнялось довольно быстро, но по мере увеличения размера массива время выполнения уменьшается (линейный поиск).

 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-данных в реляционную базу данных.

2. JSON — это просто формат сериализации, способ описания данных в виде текста. На самом деле не существует никакой «функциональности JSON» для изменения данных.

3. Это Python 2 или 3?

4. @Tomalak спасибо, рассмотрю возможность превращения его в базу данных.

5. @RemcoGerlich питон 3. Я подумал, что, вероятно, для этого не было какой-то функциональности, как я искал сам, я надеялся, что может быть какой-то более питонический способ сделать то, что я пытался, который был бы более эффективным.

Ответ №1:

Что-то вроде

 from collections import defaultdict
result = defaultdict(dict)

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

Я бы сделал это, но с 8 миллионами элементов, возможно, пришло время заглянуть в базы данных.

Комментарии:

1. Спасибо — я, вероятно, загляну в базы данных.