python字典合并_合并两个字典列表,将值加在一起

您需要将输入字典转换为(title:count)对,并使用它们作为Counter中的键和值;然后求和后,可以将它们转换回原来的格式:

from collections import Counter

summed = sum((Counter({elem['title']: elem['views']}) for elem in a + b), Counter())

c = [{'title': title, 'views': counts} for title, counts in summed.items()]

演示:

>>> from collections import Counter

>>> a = [{'title': 'Learning How to Program', 'views': 1},

... {'title': 'Mastering Programming', 'views': 3}]

>>> b = [{'title': 'Learning How to Program', 'views': 7},

... {'title': 'Mastering Programming', 'views': 2},

... {'title': 'Programming Fundamentals', 'views': 1}]

>>> summed = sum((Counter({elem['title']: elem['views']}) for elem in a + b), Counter())

>>> summed

Counter({'Learning How to Program': 8, 'Mastering Programming': 5, 'Programming Fundamentals': 1})

>>> [{'title': title, 'views': counts} for title, counts in summed.items()]

[{'views': 8, 'title': 'Learning How to Program'}, {'views': 5, 'title': 'Mastering Programming'}, {'views': 1, 'title': 'Programming Fundamentals'}]

这里的目标是每个计数具有唯一的标识符.如果您的词典比较复杂,则需要将整个词典(减去计数)转换为唯一标识符,或者从词典中选择一个值作为该标识符.然后将每个标识符的观看次数相加.

从您更新的示例中,URL将是一个很好的标识符.这样您就可以收集视图计数:

per_url = {}

for entry in a + b:

key = entry['url']

if key not in per_url:

per_url[key] = entry.copy()

else:

per_url[key]['views'] += entry['views']

c = per_url.values() # use list(per_url.values()) on Python 3

这只是使用字典本身(或至少是遇到的第一个字典的副本)来汇总视图计数:

>>> from pprint import pprint

>>> a = [{'title': 'Learning How to Program', 'views': 1,'url': '/4XvR', 'slug': 'learning-how-to-program'},

... {'title': 'Mastering Programming', 'views': 3,'url': '/7XqR', 'slug': 'mastering-programming'}]

>>> b = [{'title': 'Learning How to Program', 'views': 7,'url': '/4XvR', 'slug': 'learning-how-to-program'},

... {'title': 'Mastering Programming', 'views': 2,'url': '/7XqR', 'slug': 'mastering-programming'},

... {'title': 'Programming Fundamentals', 'views': 1,'url': '/93hB', 'slug': 'programming-fundamentals'}]

>>> per_url = {}

>>> for entry in a + b:

... key = entry['url']

... if key not in per_url:

... per_url[key] = entry.copy()

... else:

... per_url[key]['views'] += entry['views']

...

>>> per_url

{'/93hB': {'url': '/93hB', 'title': 'Programming Fundamentals', 'slug': 'programming-fundamentals', 'views': 1}, '/4XvR': {'url': '/4XvR', 'title': 'Learning How to Program', 'slug': 'learning-how-to-program', 'views': 8}, '/7XqR': {'url': '/7XqR', 'title': 'Mastering Programming', 'slug': 'mastering-programming', 'views': 5}}

>>> pprint(per_url.values())

[{'slug': 'programming-fundamentals',

'title': 'Programming Fundamentals',

'url': '/93hB',

'views': 1},

{'slug': 'learning-how-to-program',

'title': 'Learning How to Program',

'url': '/4XvR',

'views': 8},

{'slug': 'mastering-programming',

'title': 'Mastering Programming',

'url': '/7XqR',

'views': 5}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值