2017-12-07 8 views
3

私はdictsのリストを持っていますが、今は各リモート識別子の合計ジョブを見つけることを試みています。私はID 64 -> 11 jobsとするために期待しています。この場合dictのリストのキーでグループ化された合計値

68 -> 0 jobs

[{ 
    'jobs': { 
     'count': 4 
    }, 
    'remote_identifier': { 
     'id': '64' 
    } 
}, { 
    'jobs': { 
     'count': 0 
    }, 
    'remote_identifier': { 
     'id': '68' 
    } 
}, { 
    'jobs': { 
     'count': 7 
    }, 
    'remote_identifier': { 
     'id': '64' 
    } 
}] 

私はすでにこのような何かを試してみましたが、私はそれだけの数をカウントするので、私のニーズに適合させる方法がわかりません発生の

from collections import Counter 
print Counter(item['remote_identifier']['id'] for item in items) 

答えて

3

:これはトリックを行う必要があります

defaultdict(<class 'int'>, {'64': 11, '68': 0}) 
1

あなたがカウントを追加するためにdefaultdictを使用することができます。

from collections import defaultdict 

jobs = [{ 
    'jobs': { 
     'count': 4 
    }, 
    'remote_identifier': { 
     'id': '64' 
    } 
}, { 
    'jobs': { 
     'count': 0 
    }, 
    'remote_identifier': { 
     'id': '68' 
    } 
}, { 
    'jobs': { 
     'count': 7 
    }, 
    'remote_identifier': { 
     'id': '64' 
    } 
}] 

counts = defaultdict(int) 

for job in jobs: 
    counts[job['remote_identifier']['id']] += job['jobs']['count'] 

print(counts) 

出力:前方かなりストレート

result = {} 
for i in items: 
    ri = i['remote_identifier']['id'] 
    j = i['jobs']['count'] 
    if ri in result: 
     result[ri] += j 
    else: 
     result[ri] = j 
result 
#{'68': 0, '64': 11} 
0

defaultdict。 (dataは、元のリストです。)次のように

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> 
>>> for d_inner in data: 
...  id_ = d_inner['remote_identifier']['id'] 
...  d[int(id_)] += d_inner['jobs']['count'] 
... 
>>> d 
defaultdict(<type 'int'>, {64: 11, 68: 0}) 
0

別の解決策は次のとおりです。

input = [{ 
    'jobs': { 
     'count': 4 
    }, 
    'remote_identifier': { 
     'id': '64' 
    } 
}, { 
    'jobs': { 
     'count': 0 
    }, 
    'remote_identifier': { 
     'id': '68' 
    } 
}, { 
    'jobs': { 
     'count': 7 
    }, 
    'remote_identifier': { 
     'id': '64' 
    } 
}] 

res = dict() 
for item in input: 

    if item['remote_identifier']['id'] in res: 
     total = res[item['remote_identifier']['id']] + item['jobs']['count'] 
    else: 
     total = item['jobs']['count'] 
    res.update({item['remote_identifier']['id']: total}) 

print res 

出力:

{'68': 0, '64': 11} 
1

最も簡単な方法は、itertoolsモジュールを使用してあります機能groupbyを提供します。

import itertools as it 

def get_id(entry): 
    return entry['remote_identifier']['id'] 

data.sort(key=get_id) 
for key, group in it.groupby(data, get_id): 
    print(key, sum(entry['jobs']['count'] for entry in group)) 

groupbyは、データがすでにあなたがグループにデータの要素を使用しているキーでソートされていることを前提としています。

関連する問題