按键分组的字典列表中值的总和

3
我有一个字典列表,现在我正在尝试查找每个远程标识符的总工作量。
在这种情况下,我期望id为64 -> 11 jobs68 -> 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 )
5个回答

4
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})

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)

输出:

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

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 假定数据已经按照用于对数据元素进行分组的键进行排序。

0

这应该能解决问题:

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

另一种解决方案如下:

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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接