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():

これは私がこれまでに持っているコードです。

4

3 に答える 3

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}}
于 2013-11-02T09:09:31.530 に答える
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.Counterと を使用した別のソリューションcollections.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})})
于 2013-11-02T09:10:37.503 に答える
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}
于 2013-11-02T09:16:10.007 に答える