arrays - Python group dict values on same date -


my question is, how can group dict key, value on same key. group different values based on key, better explanation provide in code.

dict

values = [{         "date": "2015-05-07",         "yt": 630.0     },     {         "date": "2015-05-07",         "fb": 16555.0     },     {         "date": "2015-05-07",         "tw": 1234.0     }] 

here example of dictionary. want check date , if date exists somewhere in dictionary collect values on same date. output like:

   values = [     {     "date":"2015-05-07",     "fb":16555.0,     "tw":1234.0,     "yt":630     } 

the whole dic:

values=[     {         "date": "2015-04-24",         "fb": 16322.0     },     {         "date": "2015-04-24",         "tw": 1206.0     },     {         "date": "2015-04-28",         "tw": 1215.0     },     {         "date": "2015-04-30",         "tw": 1224.0     },     {         "date": "2015-04-30",         "fb": 16408.0     },     {         "date": "2015-05-01",         "tw": 1226.0     },     {         "date": "2015-05-01",         "fb": 16436.0     },     {         "date": "2015-05-02",         "tw": 1227.0     },     {         "date": "2015-05-02",         "fb": 16451.0     },     {         "date": "2015-05-04",         "fb": 16506.0     },     {         "date": "2015-05-04",         "tw": 1229.0     },     {         "date": "2015-05-05",         "tw": 1232.0     },     {         "date": "2015-05-05",         "fb": 16526.0     },     {         "date": "2015-05-06",         "tw": 1232.0     },     {         "date": "2015-05-06",         "fb": 16541.0     },     {         "date": "2015-05-07",         "yt": 630.0     },     {         "date": "2015-05-07",         "fb": 16555.0     },     {         "date": "2015-05-07",         "tw": 1234.0     },     {         "date": "2015-05-08",         "fb": 16568.0     },     {         "date": "2015-05-08",         "tw": 1238.0     },     {         "date": "2015-05-09",         "fb": 16582.0     },     {         "date": "2015-05-09",         "tw": 1237.0     },     {         "date": "2015-05-10",         "fb": 16594.0     },     {         "date": "2015-05-10",         "tw": 1237.0     },     {         "date": "2015-05-11",         "tw": 1242.0     },     {         "date": "2015-05-11",         "fb": 16600.0     },     {         "date": "2015-05-12",         "tw": 1243.0     },     {         "date": "2015-05-12",         "fb": 16618.0     },     {         "date": "2015-05-13",         "fb": 16630.0     },     {         "date": "2015-05-13",         "yt": 630.0     },     {         "date": "2015-05-13",         "tw": 1246.0     },     {         "date": "2015-05-14",         "yt": 630.0     },     {         "date": "2015-05-14",         "fb": 16635.0     },     {         "date": "2015-05-14",         "tw": 1249.0     },     {         "date": "2015-05-15",         "yt": 630.0     },     {         "date": "2015-05-15",         "fb": 16644.0     },     {         "date": "2015-05-15",         "tw": 1252.0     },     {         "date": "2015-05-16",         "yt": 630.0     },     {         "date": "2015-05-16",         "tw": 1254.0     },     {         "date": "2015-05-16",         "fb": 16654.0     },     {         "date": "2015-05-17",         "tw": 1255.0     },     {         "date": "2015-05-17",         "fb": 16668.0     },     {         "date": "2015-05-17",         "yt": 630.0     },     {         "date": "2015-05-18",         "yt": 632.0     },     {         "date": "2015-05-18",         "tw": 1257.0     },     {         "date": "2015-05-18",         "fb": 16678.0     },     {         "date": "2015-05-19",         "fb": 16688.0     },     {         "date": "2015-05-19",         "yt": 634.0     },     {         "date": "2015-05-19",         "tw": 1256.0     },     {         "date": "2015-05-20",         "yt": 634.0     },     {         "date": "2015-05-20",         "fb": 16695.0     },     {         "date": "2015-05-20",         "tw": 1259.0     },     {         "date": "2015-05-21",         "tw": 126.0     },     {         "date": "2015-05-21",         "yt": 635.0     },     {         "date": "2015-05-21",         "fb": 16698.0     },     {         "date": "2015-05-22",         "tw": 1262.0     },     {         "date": "2015-05-22",         "fb": 16712.0     },     {         "date": "2015-05-22",         "yt": 635.0     },     {         "date": "2015-05-23",         "fb": 16726.0     },     {         "date": "2015-05-23",         "yt": 636.0     },     {         "date": "2015-05-23",         "tw": 1264.0     },     {         "date": "2015-05-24",         "tw": 1265.0     },     {         "date": "2015-05-24",         "yt": 636.0     },     {         "date": "2015-05-24",         "fb": 16731.0     },     {         "date": "2015-05-25",         "yt": 636.0     },     {         "date": "2015-05-25",         "tw": 1269.0     },     {         "date": "2015-05-25",         "fb": 16752.0     },     {         "date": "2015-05-26",         "yt": 637.0     },     {         "date": "2015-05-26",         "fb": 16766.0     },     {         "date": "2015-05-26",         "tw": 127.0     }] 

code

from collections import defaultdict res = defaultdict(list) v, k in values: res[k].append(v)  print res 

python version: 2.7

i use itertools.groupby group dictionaries based on same date , each date create dictionary (that used append result list) ,lets call maindict, , update maindict dictionaries group. example -

from itertools import groupby operator import itemgetter nvalues = [] dt, k in groupby(sorted(values,key=itemgetter('date')),key=itemgetter('date')):     maindict = {'date':dt}     d in k:         maindict.update(d)     nvalues.append(maindict) 

please note, use latest value each key in resultant dictionary, if there multiple such keys in values list same date.

another thing note itertools.groupby expects list sorted according key group, hence have following in - sorted(values,key=itemgetter('date')) . if list sorted according date , not needed.


demo -

>>> values = [{ ...         "date": "2015-05-07", ...         "yt": 630.0 ...     }, ...     { ...         "date": "2015-05-07", ...         "fb": 16555.0 ...     }, ...     { ...         "date": "2015-05-07", ...         "tw": 1234.0 ...     }] >>> >>> itertools import groupby >>> operator import itemgetter >>> nvalues = [] >>> dt, k in groupby(sorted(values,key=itemgetter('date')),key=itemgetter('date')): ...     maindict = {'date':dt} ...     d in k: ...             maindict.update(d) ...     nvalues.append(maindict) ... >>> print(nvalues) [{'date': '2015-05-07', 'tw': 1234.0, 'fb': 16555.0, 'yt': 630.0}] 

Comments