在python中过滤数据

时间:2016-04-14 03:46:31

标签: python loops

我正在开发一个用于python的网络抓取工具,用于收集网站上用户发布的帖子信息,并比较所有用户参与的帖子的分数。目前我的结构是以便收到以下数据:

results是一个由username编制的字典,其中包含postpoints键值结构中每个用户的历史记录的字典。

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]

我遇到的问题是,这实际上并没有过滤掉未共享的帖子,因此也无法提供准确的分值。

我的结构出了什么问题,是否有更简单的方法来查找常用帖子?

3 个答案:

答案 0 :(得分:1)

我想你可能有两个问题:

  1. 使用common列表表示当您通过common.remove删除项目时,它只会删除找到的第一个项目(可能会有更多项目)
  2. 您不只是为所有用户分享的帖子添加积分 - 您在遇到用户时为用户添加积分 - 在您知道该帖子是否由所有人共享之前
  3. 如果没有一些实际的数据可用,编写工作代码有点困难,但试试这个:

    # 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))