Python 在同一日期对 dict 值进行分组

标签 python arrays parsing dictionary

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

字典

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
    }

整个迪克:

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

最佳答案

我会使用 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}]

关于Python 在同一日期对 dict 值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795772/

相关文章:

javascript - 我如何使用answers.length 从数组中选择任意一个条目?

c++ - 将 char* 分成几个变量

java - 解析xml文档Java "cannot be resolved"

python - 是否有与 C# 的 DateTime.TryParse() 等效的 Python?

Python Numpy 高维矩阵乘法

python - 使用 in, on 列表检查元组中的一项

c# - 如何使用 Linq 解析 XML 文件 - 后代

python - 如何在 Snow Leopard 中使用 Python 捕获 iSight 帧?

JavaScript:为什么使用原型(prototype)来调用函数而不是仅仅调用函数?

python - 如何在Python框架Scrapy中从页面解析RSS链接(获取RSS的url)?