映射嵌套在dict中的列表

问题描述 投票:0回答:2

Data

我很好奇我是否可以转换以下数据

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

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

使用词典理解。

所以基本上只是用对象本身的单个属性替换那些列表对象。所有对象都来自同一类型,因此肯定具有id属性。

Dict comprehension

我想出了以下不起作用的解决方案:

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

Problem

生成的字典只包含具有一个值的列表(迭代的最后一个值),因为这一行:

key: [obj.id]

每次只创建一个包含一个值的新列表。

所以我没有创建一个新的列表,我想将append新的obj_ids列入现有列表,但我不知道如何。我认为它必须看起来像这样:

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

但显然这也无法工作,因为data尚未分配,即使它将是:第一个obj.id无法附加,因为列表从未初始化。

(我正在使用Python 3.7)

python dictionary list-comprehension dictionary-comprehension
2个回答
1
投票

功能方法

这不是一个非常pythonic,但仍然有趣的方式:

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
投票

List comprehension

所以我找到了一个使用列表理解的解决方案:

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

只需要在列表理解中移动循环(for obj in obj_list)。

这也解决了第一个obj没有列表存在的问题,而且没有其他objs需要append方法或类似的东西。

© www.soinside.com 2019 - 2024. All rights reserved.