2015-12-30 15 views
6

ich diese Zeilen aus db bin holen:kombinieren Werte von mehreren Objekten in einem einzigen Wörterbuch

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' 
.... 

und ich möchte ein einziges Wörterbuch für jede blog_id bauen: z

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

Ich versuche, auf diese Weise:

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

aber das ist soo falsch, res enthält hier blog 13 3-mal und blog 12 isnot auch in der endgültigen Liste. Ich fühle mich jetzt so dumm, was vermisse ich?

+0

Sie fügen das gleiche Wörterbuch Objekt 'res', Sie erstellen nicht einmal neue dict-Objekte – thefourtheye

+0

@thefourtheye Ich weiß :(Ich muss auf dem Weg dynamisch neue dict erstellen ... – doniyor

+3

warum nicht verwenden Sie die' blog_id' als äußere Taste und erstellen Sie ein Diktat von diktiert? –

Antwort

4

Zunächst sammeln sich alle Daten zu jedem blog_id in einem Wörterbuch entspricht, wie dieser

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

Nun fügen Sie die entsprechenden blog_id allen akkumulierten Wörterbücher,

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

jetzt nur erhalten alle values der groups, mit groups.values(), um das Ergebnis zu erhalten.

Hinweis: Wenn Sie die ursprüngliche Reihenfolge der Elemente auf der blog_id Basis beibehalten möchten, dann stattdessen ein normales Wörterbuch zu verwenden, verwenden collections.OrderedDict, wie diese

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