我正在开发一个用于python的网络抓取工具,用于收集网站上用户发布的帖子信息,并比较所有用户参与的帖子的分数。目前我的结构是以便收到以下数据:
results
是一个由username编制的字典,其中包含post
,points
键值结构中每个用户的历史记录的字典。
common
是一个列表,以结果中第一个用户的词典中的所有帖子开头。此列表应仅过滤为所有用户共同的帖子
points
是一个由用户名编制索引的字典,用于保存共享帖子上的总点数。
我的过滤代码如下:
common = list(results.values()[0].keys())
for user in results:
for post_hash in common:
if post_hash not in results[user]:
common.remove(post_hash)
else:
points[user] += results[user][post_hash]
我遇到的问题是,这实际上并没有过滤掉未共享的帖子,因此也无法提供准确的分值。
我的结构出了什么问题,是否有更简单的方法来查找常用帖子?
答案 0 :(得分:1)
我想你可能有两个问题:
common
列表表示当您通过common.remove
删除项目时,它只会删除找到的第一个项目(可能会有更多项目)如果没有一些实际的数据可用,编写工作代码有点困难,但试试这个:
# this should give us a list of posts shared by all users
common = set.intersection(*[set(k.keys()) for k in results.values()])
# there's probably a more efficient (functional) way of summing the points
# by user instead of looping, but simple is good.
for user in results:
for post_hash in common:
points[user] += results[user][post_hash]
答案 1 :(得分:0)
sess.run('add:0')
看看是否有效。
答案 2 :(得分:0)
from collections import Counter
from functools import reduce
posts = []
# Create an array of all the post hashes
for p in results.values():
posts.extend(p.keys())
# use Counter to create a dictionary like object that where the key
# is the post hash and the value is the number of occurrences
posts = Counter(posts)
for user in results:
# Reduce only the posts that show up more than once.
points[user] = reduce(lambda x,y: x+y, (post for post in user if posts[post] > 1))