您需要将输入字典转换为(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}]