Отображение списка, вложенного в dict - PullRequest
0 голосов
/ 23 ноября 2018

Данные

Мне любопытно, смогу ли я преобразовать следующие данные

old_data = {
  "key0": [obj0, obj1],
  "key1": [obj2, obj3]
}

в

data = {
  "key0": [obj0.id, obj1.id],
  "key1": [obj2.id, obj3.id]
}

, используя диктовку.

Таким образом, в основном, просто заменив эти объекты списка одним атрибутом самого объекта.Все объекты относятся к одному типу и, следовательно, имеют атрибут id.

Понимание Dict

Я нашел следующее решение, которое не работает:

data = {
  key: [obj.id]
  for key, obj_list in old_data.items()
  for obj in obj_list
}

Задача

Результирующий словарь просто содержит списки с ровно одним значением (последнее значение, которое было повторено) из-за этой строки:

key: [obj.id]

создает каждый раз только новыйlist с одним значением.

Поэтому вместо создания нового списка я хотел append new obj_id s для существующего списка, но я не знаю, как.Я думаю, это должно выглядеть примерно так:

key: data[key].append(obj.id)

Но, очевидно, это также не может работать, потому что data еще не назначен, и даже если он будет: первый obj.id не можетбыть добавленным, потому что список никогда не был инициализирован.

(я использую Python 3.7)

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Функциональный подход

Вот не такой уж питоновский, но все же интересный способ сделать это:

from functools import partial
from operator import attrgetter

old_data = {
  "key0": [obj0, obj1],
  "key1": [obj2, obj3]
}

data = dict(zip(old_data, map(list, map(partial(map, attrgetter('id')), old_data.values()))))
0 голосов
/ 23 ноября 2018

Понимание списка

Итак, я нашел решение, используя понимание списка:

data = {
  key: [obj.id for obj in obj_list]
  for key, obj_list in old_data.items()      
}

Просто пришлось переместить цикл (for obj in obj_list) внутри понимания списка.

Это также решает проблему, заключающуюся в том, что для первого obj список не существует и, кроме того, никаким другим obj s не нужен метод append или что-то подобное.

...