我很好奇我是否可以转换以下数据
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
新的obj_id
s列入现有列表,但我不知道如何。我认为它必须看起来像这样:
key: data[key].append(obj.id)
但显然这也无法工作,因为data
尚未分配,即使它将是:第一个obj.id
无法附加,因为列表从未初始化。
(我正在使用Python 3.7)
这不是一个非常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()))))
所以我找到了一个使用列表理解的解决方案:
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
方法或类似的东西。