在dict列表中按键分组的和值

时间:2017-12-07 09:52:45

标签: python python-2.7

我有一个dicts列表,现在我正在尝试查找每个远程标识符的总作业。

在这种情况下,我希望标识为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 个答案:

答案 0 :(得分:3)

非常直接的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 :(得分: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})

答案 2 :(得分:1)

最简单的方法是使用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

use test
db.grantRolesToUser("user1", [ "readWrite"] )

请注意,identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); 假定数据已按您用于对数据中元素进行分组的键进行排序。

答案 3 :(得分: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}

答案 4 :(得分: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}