Копирование значения из одного словаря в другойPython

Программы на Python
Ответить
Anonymous
 Копирование значения из одного словаря в другой

Сообщение Anonymous »

У меня есть ситуация, когда у меня есть несколько очень больших списков словарей и словарей, содержащих огромные объемы данных, созданных в других местах, которые доставляются в очень больших объектах json. Мне нужно взять информацию из этой большой кучи данных и создать новый список словарей, содержащий подмножество данных. Но полученные новые словари не могут иметь никаких ссылок на старые словари, из которых были взяты данные.
Пример
рассмотрим следующие два источника данных. (очень простой пример на реальных данных, с которыми мы пытаемся работать):

Код: Выделить всё

 list_1 = [{ "id": "12", "b": 33,   "d": "rty" },
{ "id": "22", "b": 135,  "d": "jjj" },
{ "id": "32", "b": 1,    "d": "trt" },
{ "id": "42", "b": 1355, "d": "ast" },]

dict_2 = { "12" : { "id": "12", "c": "ada" },
"22" : { "id": "22", "c": "pklm" },
"32" : { "id": "32", "c": "pppf" },
"42" : { "id": "42", "c": "eeef" },}
затем мы хотим создать новый список словарей на основе этих данных. Правило заключается в том, что для каждого словаря в list_a, где значение b меньше 40, мы хотим создать новый словарь с тем же идентификатором и значениями c и d и добавить этот новый словарь в новый список.

Код: Выделить всё

 newlist = [{ "id": "12", "c": "ada", "d": "rty" },
{ "id": "32", "c": "pppf", "d": "trt" },
если мы просто сделаем это:

Код: Выделить всё

newlist = []
for x in list_1:
if x["b"] < 40:
dict = {"id": x["id"],
"d": x["d"],
"c": (dict_2[x["id"]])["c"] }
newlist.append(dict)
тогда словари в новом списке будут содержать ссылки на list_1 и dict_2. Это вполне хорошо, когда вы хотите сэкономить память классическим способом, я полагаю.
Но в нашем случае нам не нужны ссылки. Нам нужно иметь возможность удалять list_1 и dict_2 из памяти после создания нового списка, чтобы таким образом сэкономить на использовании памяти. Новый список должен продолжать существовать в памяти. List_1 и dict_2 очень большие, а полученный новый список имеет лишь небольшую часть.
Когда мы проверяем с помощью модуля Memory_profiler, мы видим, что Python не освобождает память, используемую list_1 и dict_2. потому что значения, взятые из этих двух источников, затем используются для установки значений в новом списке, и из-за этого два источника все еще должны находиться в памяти из-за ссылок. :/
Как это можно сделать на Python? Можно ли это сделать на Python? Как мы можем получить подлинную копию, а не ссылку на источник? Сейчас мы склоняемся к тому, чтобы записать newdict в файл, стереть все, а затем перезагрузить newdict из файла в память и продолжить оттуда. Но это кажется довольно грубым решением.
Есть идеи?

Подробнее здесь: https://stackoverflow.com/questions/791 ... to-another
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»