#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. Спасибо — я, вероятно, загляну в базы данных.