2016-02-19 61 views
2

蟒查詢到DB作爲基於米創建基於querydata

m = Request.objects.filter(type__contains='mega') 

和一個查詢集鍵,值對作爲

x = m.values('set', 'value') 

它返回像

[{'value': u'sasi', 'set': u'ITEM1'}, {'value': u'babu', 'set': u'ITEM1'},{'value': u'unni', 'set': u'ITEM2'},...] 

值我打算根據這些數據創建一本詞典。 SO它會像

{'ITEM1': [sasi, babu], 'ITEM2':[unni], 'ITEM3': [x, y, z] , ....} 

如何將上述查詢集轉換爲此字典格式?任何想法的傢伙?提前致謝。

回答

4

使用itertools.groupbydictionary comprehension

>>> data = [ 
...  {'value': u'sasi', 'set': u'ITEM1'}, 
...  {'value': u'babu', 'set': u'ITEM1'}, 
...  {'value': u'unni', 'set': u'ITEM2'}, 
...  {'value': u'x', 'set': u'ITEM3'}, 
...  {'value': u'y', 'set': u'ITEM3'}, 
...  {'value': u'z', 'set': u'ITEM3'}, 
... ] 
>>> 
>>> data = sorted(data, key=lambda d: d['set']) 
>>> import itertools 
>>> {key: list(d['value'] for d in grp) 
... for key, grp in itertools.groupby(data, key=lambda d: d['set'])} 
{u'ITEM2': [u'unni'], u'ITEM3': [u'x', u'y', u'z'], u'ITEM1': [u'sasi', u'babu']} 

您可以跳過sorted呼叫如果查詢集是由set排序。

+1

您可以使用'operator.itemgetter('set')'而不是'lambda' – styvane

+0

@ user3100115,您是對的。爲簡潔起見,我在這裏使用了'lambda'。 – falsetru

+0

whats grp falsetru? – vellattukudy

1
from collections import defaultdict 
data = defaultdict(list) 
for item in x: 
    data[item['set']].append(item['value']) 
+0

偉大的答案丹尼爾。但是我得到了一個'defaultdict(,'當我打印數據時 – vellattukudy

+0

那麼,如果它困擾你,最終將它轉換成帶有'dict(data)'的字典,但它沒有任何區別 –

+0

因爲當我迭代該字典只是根據你的回答創建的:'對於k,v的數據: print k'作爲ValueError獲取錯誤:解包的值太多 – vellattukudy