Python 3 - Объем понимания словаря -> в объекте -> в понимании списка - PullRequest
1 голос
/ 03 августа 2020

Недавно я столкнулся с этой проблемой в Python 3.x, и, поскольку мне не удалось найти решение, я ищу некоторые разъяснения, как решить эту проблему должным образом.

list_of_dicts = [dict_a, dict_b]
dict_a = {"id": 123, "foo": "bar"}
...

На основе в списке dicts я хочу создать другой список.

Этот список должен содержать какие-то объекты, которые я затем буду использовать для чего-то, в моем случае массовая запись в базу данных, это работает как ожидалось:

operations = [ Object(arg = {"id": doc["id"]}) for doc in list_of_dicts ]
write_to_db(operations)

Моя проблема заключается в следующем: в некоторых случаях я хочу добавить дополнительные пары значений ключа в словарь arg:

further_keys = ["foo"]
operations = [ Object(arg = {"id": doc["id"]}.update({i:doc[i] for i in further_keys}))
               for doc in list_of_dicts ]

К сожалению, это не удается, как "do c" не назначается в контексте dict comp

Вопрос в том, можно ли каким-то образом установить область действия для понимания списка?

Я не самый продвинутый кодировщик, так что рад любому здесь ценный вклад

Спасибо!

Редактировать

Спасибо, на самом деле это так просто, понятия не имею, почему я подумал об использовании «обновления» в этом кейс. Вот минимальный рабочий образец:

import pymongo

data = [{"id":1, "map": "DE", "date":"today"}, 
        {"id":2, "map": "FR", "date":"tomorrow"},
        {"id":3, "map": "IT", "date":"yesterday"}]

additional_keys = ["map"]
standard_key = ["id"]
key_tuple = tuple(standard_key + additional_keys)

operations = [ pymongo.operations.ReplaceOne(
               filter={key:doc[key] for key in key_tuple}, 
               replacement=doc, 
               upsert=True) 
               for doc in data ]

Который - по желанию - дает:

[ReplaceOne({'id': 1, 'map': 'DE'}, {'id': 1, 'map': 'DE', 'date': 
 'today'}, True, None),
 ReplaceOne({'id': 2, 'map': 'FR'}, {'id': 2, 'map': 'FR', 'date': 
 'tomorrow'}, True, None),
 ReplaceOne({'id': 3, 'map': 'IT'}, {'id': 3, 'map': 'IT', 'date': 
 'yesterday'}, True, None)]

Большое спасибо. В будущем сделаю сразу минимальный рабочий образец!

1 Ответ

0 голосов
/ 03 августа 2020

Вы можете использовать понимание словаря внутри понимания списка. Используя этот ответ, вы можете составить следующее:

operations = [ Object(args = {key:doc[key] for key in ("id", "name", "other key") } ) for doc in list_of_dicts ]

Написал этот мобильный телефон, поэтому не тестировал, но вы можете заполнить этот кортеж дополнительными ключами, которые хотите добавить к args=

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...