2015-09-26 117 views
1

我的問題是,如何可以輕鬆地組合一些字典鍵,在同一個鍵上的值。基於密鑰對不同的值進行分組,我將在代碼中提供更好的解釋。Python組字典值同一日期

字典

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

+1

你想,如果某個值重複做什麼? –

+0

我想丟棄它。 – marin

+0

就像兩個字典具有相同的「日期」和相同的「密鑰」,但具有不同的值。你什麼意思丟棄? –

回答

3

我會用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}] 
+0

謝謝你的邏輯@Anand S庫馬爾 – marin

+0

很高興我可以幫助。 :-) –

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

print d.values()