我的问题是,如何轻松地将一些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
答案 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()