【问题标题】:Mapping over a list nested inside a dict映射嵌套在字典中的列表
【发布时间】:2018-11-23 13:10:43
【问题描述】:

数据

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

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

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

使用字典理解。

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

字典理解

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

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

问题

由于这一行,结果字典只包含只有一个值(迭代的最后一个值)的列表:

key: [obj.id]

每次只创建一个具有一个值的新列表。

所以我不想创建一个新列表,而是想 append new obj_ids 到现有列表,但我不知道如何。 我认为它一定看起来像这样:

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

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

(我使用的是 Python 3.7)

【问题讨论】:

  • {key: map(operator.attrgetter('id'), obj) for key, obj in old_data.items()} 呢?
  • @MatiasCicero 不知道这种可能性。我认为也应该有效。

标签: python dictionary list-comprehension dictionary-comprehension


【解决方案1】:

功能方法

这是一种不太像 Python 的方式,但仍然很有趣:

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()))))

【讨论】:

    【解决方案2】:

    列表理解

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

    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方法或类似的方法。

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 2013-04-30
      • 2020-11-05
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 2017-05-25
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多