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