2015-12-30 14 views
6

मैं 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 भी अंतिम सूची में isnot। मुझे अभी इतना मूर्ख लगता है, मुझे क्या याद आ रही है?

+0

आप के लिए एक ही वस्तु शब्दकोश जोड़ रहे हैं की तरह 'res', आप नई dict ऑब्जेक्ट ऑब्जेक्ट्स भी नहीं बना रहे हैं – thefourtheye

+0

@thefourtheye मुझे पता है :(मुझे किसी भी तरह से गतिशील रूप से नए रास्ते को बनाने की ज़रूरत है ... – doniyor

+3

क्यों' blog_id' को बाहरी कुंजी के रूप में उपयोग न करें और एक dict dicts? –

उत्तर

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() 
... 
संबंधित मुद्दे