2015-12-30 37 views
6

我从数据库中读取这些行:结合几个对象的值到一个单一的字典

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甚至在最终名单状态并没有。我现在觉得很愚蠢,我错过了什么?

+0

您添加相同的字典对象'res',你甚至没有创建新的字典对象 – thefourtheye

+0

@thefourtheye我知道:(我需要创建新的字典动态莫名其妙... – doniyor

+3

为什么不使用'blog_id'作为外键,并创建一个字典类型的字典? –

回答

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 

现在,只得到groups的所有values,与groups.values()得到结果。

注:如果您想保留基础上,blog_id元素的原始顺序,然后而是采用了普通的字典,使用collections.OrderedDict,这样

from collections import OrderedDict 
groups = OrderedDict() 
... 
相关问题