2013-11-02 28 views
0

以下是1個Python腳本的輸出:
多詞典 - 對於所有相同的密鑰,做一些聚集

{ 12: {'@': False, '#': False, 'word': 'good#1st#time#will', 'longword': True, 'title': False, 'charcount': 18, 'uppercase': False, 'stop': False, 'sscore': False, 'url': False, '!!!': False} } 
{ 12: {'@': False, '#': False, 'word': 'be', 'longword': False, 'title': False, 'charcount': 2, 'uppercase': False, 'stop': True, 'sscore': False, 'url': False, '!!!': False} } 
{ 12: {'@': False, '#': False, 'word': 'going', 'longword': False, 'title': False, 'charcount': 5, 'uppercase': False, 'stop': False, 'sscore': False, 'url': False, '!!!': False} } 
{ 13: {'@': False, '#': False, 'word': 'back#', 'longword': False, 'title': False, 'charcount': 5, 'uppercase': False, 'stop': False, 'sscore': False, 'url': False, '!!!': False} } 
{ 13: {'@': False, '#': False, 'word': 'http://instagr.am/p/rx9939civ8/\xc2\xa0', 'longword': True, 'title': False, 'charcount': 33, 'uppercase': False, 'stop': False, 'sscore': False, 'url': True, '!!!': False} } 

在另一個python腳本,上述被作爲輸入。所有上面的代碼是不同的字典是1腳本的輸出,但在另一個腳本中,我想要做一個'charcount'或計數longword = True的數字,這些多字典具有相同的鍵,因此輸出如下所示:

{ 12: {'longword': 1 ,'charcount': 25} } 
{ 13: {'longword': 1 ,'charcount': 38} } 


我的數據集不組他們,但輸出單個字典12作爲密鑰和13作爲關鍵字。我的代碼應該能夠找到所有相同的密鑰,因爲我有一個大的數據集,並進行上述聚合
這是我的代碼,它將上述作爲多字典,但我不明白我將如何做聚合。

dicts = {} 
for line in sys.stdin: 
    d = ast.literal_eval(line) 
    for k,v in d.items(): 
     dicts.setdefault(k, []).append(v) 
     for key,val in v.items(): 

這是我到目前爲止的代碼。

+0

是外字典排序?換句話說,你的數據集是不是所有的'12'行,然後是所有'13'行等? –

+0

我也必須按鍵排序詞典。我的數據集不會對它們進行分組,但會輸出單個字典,其中12個爲關鍵字,13個爲關鍵字。 我的代碼應該能夠找到所有相同的密鑰,因爲我有一個大數據集並執行上述聚合。 – fscore

回答

1

您不需要迭代v,因爲您感興趣的密鑰是固定的。

import ast 
import sys 

dicts = {} 
for line in sys.stdin: 
    d = ast.literal_eval(line) 
    for k, v in d.items(): 
     inner_dict = dicts.setdefault(k, {}) 
     inner_dict['longword'] = inner_dict.get('longword', 0) + v.get('longword', 0) 
     inner_dict['charcount'] = inner_dict.get('charcount', 0) + v.get('charcount', 0) 

print dicts 

dicts成爲:

{12: {'charcount': 25, 'longword': 1}, 
13: {'charcount': 38, 'longword': 1}} 
+0

它是如何找到相同的密鑰? – fscore

+0

@ kulkarni.ankita09,在代碼中明確指定:'inner_dict('longword',0)','v.get('longword',0)'。 – falsetru

+0

它只是給出{'charcount':25,'longword':1} {'charcount':38,'longword':1}作爲輸出而不是密鑰。請參閱我編輯的代碼。 – fscore

1

使用collections.default

import sys 
import ast 
from collections import defaultdict 
my_dict = defaultdict(lambda: {'longword':0, 'charcount':0}) 
for line in sys.stdin: 
    d = ast.literal_eval(line) 
    key = list(d)[0] 
    my_dict[key] = {k: d[key][k]+v for k, v in my_dict[key].items()} 
print my_dict 

輸出:

defaultdict(<function <lambda> at 0xb7466a04>, 
{12: {'charcount': 25, 'longword': 1}, 
    13: {'charcount': 38, 'longword': 1}}) 

使用collectons.Countercollections.defaultdict另一種解決方案:

import sys 
import ast 
from collections import defaultdict, Counter 
keys = ['longword', 'charcount'] 
my_dict = defaultdict(Counter) 
for line in sys.stdin: 
    d = ast.literal_eval(line) 
    key = list(d)[0] 
    my_dict[key].update(**{k:d[key][k] for k in keys}) 
print my_dict  

輸出:

defaultdict(<class 'collections.Counter'>, 
{12: Counter({'charcount': 25, 'longword': 1}), 
13: Counter({'charcount': 38, 'longword': 1})}) 
1

的東西簡單,因爲

from collections import defaultdict 

dicts =[ { 12: {'@': False, '#': False, 'word': 'good#1st#time#will', 'longword': True, 'title': False, 'charcount': 18, 'uppercase': False, 'stop': False, 'sscore': False, 'url': False, '!!!': False} }, 
    { 12: {'@': False, '#': False, 'word': 'be', 'longword': False, 'title': False, 'charcount': 2, 'uppercase': False, 'stop': True, 'sscore': False, 'url': False, '!!!': False} }, 
    { 13: {'@': False, '#': False, 'word': 'back#', 'longword': False, 'title': False, 'charcount': 5, 'uppercase': False, 'stop': False, 'sscore': False, 'url': False, '!!!': False} }, 
    { 13: {'@': False, '#': False, 'word': 'http://instagr.am/p/rx9939civ8/\xc2\xa0', 'longword': True, 'title': False, 'charcount': 33, 'uppercase': False, 'stop': False, 'sscore': False, 'url': True, '!!!': False} }, 
    { 12: {'@': False, '#': False, 'word': 'going', 'longword': False, 'title': False, 'charcount': 5, 'uppercase': False, 'stop': False, 'sscore': False, 'url': False, '!!!': False} } 
] 

result = defaultdict(lambda: defaultdict(int)) 

for d in dicts: 
    for k, v in d.items(): 
     result[k]['longword'] += v.get('longword', 0) 
     result[k]['charcount'] += v.get('charcount', 0) 

for k, v in result.items(): 
    print k, dict(v) 
#12 {'charcount': 25, 'longword': 1} 
#13 {'charcount': 38, 'longword': 1} 
相關問題