将几个对象的值组合成一个字典

时间:2015-12-30 16:09:22

标签: python dictionary

我从db:

获取这些行
blog_id='12', field_name='title', translation='title12 in en', lang='en'
blog_id='12', field_name='desc', translation='desc12 in en', lang='en'

blog_id='13', field_name='title', translation='title13 in en', lang='en'
blog_id='13', field_name='desc', translation='desc13 in en', lang='en'
....

我想为每个blog_id构建一个字典:例如

[
   {'blog': '12', 'title': 'title12 in en', 'desc': 'desc12 in en'},
   {'blog': '13', 'title': 'title13 in en', 'desc': 'desc13 in en'},
   ....
]

我正在尝试这种方式:

res = []
dict_ = {}
for trans in translations: # 'translations' is QuerySet, already filtered by 'en'  
    if trans.blog_id in dict_.values():
        dict_[trans.field_name] = trans.translation
    else:
        dict_['blog'] = trans.blog_id
        dict_[trans.field_name] = trans.translation

    res.append(dict_)

但这太错了,res包含blog 13 3次,blog 12甚至不在最终列表中。我现在感觉很蠢,我错过了什么?

1 个答案:

答案 0 :(得分:4)

首先,累积字典中每个blog_id对应的所有数据,如

groups = {}
for trans in translations:
  groups.setdefault(trans.blog_id, {})[trans.field_name] = trans.translation

现在,将相应的blog_id附加到所有累积的词典

for key in groups:
  groups[key]['blog'] = key

现在,只需获取values的所有groupsgroups.values()即可获得结果。

注意:如果您想根据blog_id保留元素的原始顺序,那么请使用collections.OrderedDict,而不是使用普通字典,

from collections import OrderedDict
groups = OrderedDict()
...