Python组在同一日期dict值

时间:2015-09-26 09:44:54

标签: python arrays parsing dictionary

我的问题是,如何轻松地将一些dict键,值放在同一个键上。根据密钥对不同的值进行分组,我将在代码中提供更好的解释。

的dict

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

这是我的字典的例子。我想要做的是检查日期,并且该日期是否存在于同一日期的字典收集值中。输出就像:

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

整个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
    }]

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

print res

Python版本:2.7

2 个答案:

答案 0 :(得分:4)

我会使用itertools.groupby根据相同的date对字典进行分组,为每个date创建一个字典(用于附加到结果列表),让我们调用这个maindict,然后使用组中的字典更新maindict。示例 -

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

请注意,如果同一key values列表中有多个此类键,则会在结果字典中使用每个date的最新值。

另外需要注意的是itertools.groupby期望列表根据要分组的键进行排序,因此我们在其中包含以下内容 - sorted(values,key=itemgetter('date'))。如果列表已根据date排序,则不需要。

演示 -

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

答案 1 :(得分:0)

d = {}
for x in values:
    if x["date"] in d:
        d[x["date"]].update(x)
    else: 
        d[x["date"]] = x

print d.values()