首页 > 解决方案 > 结合列表字典的数据聚合

问题描述

我有一个包含以下内容的文件。

1234:雅虎\tgoogle\tmicrosoft\tapple\tyahoo

2345:苹果\tgoogle\tgoogle

4567:雅虎\tapple\tapple

我有兴趣获得输出

“输出”--> searchTerm : UserCnt, searchCnt

雅虎:2、3

苹果:3、4

等等...

fname="/tmp/sample.txt"
with open(fname) as f:
   content = f.readlines()

value = [ i.strip().split(':') for i in content ]
dict = {k:v.split('\t') for k,v  in value}

d = defaultdict(int)
for k,v in dict.items():
    for name in v:
      d[name] +=1
    print k,d

但是,如何获取每个搜索词的用户数和搜索数。

标签: pythongroup-by

解决方案


是的,您可以使用 adefaultdict来执行此操作(或者也可以使用常规dict,但我认为 adefaultdict更灵活)

In [36]: a = defaultdict(defaultdict)

In [40]: l  = ["1234:yahoo\tgoogle\tmicrosoft\tapple\tyahoo", "2345:apple\tgoogle\tgoogle", "4567:yahoo\tapple\tapple"]

In [48]: for li in l:
    ...:     search_id, terms = li.split(":")[0], li.split(":")[1]
    ...:     terms = terms.split("\t")
    ...:     for term in terms:
    ...:         if "search_cnt" in a[term]:
    ...:             a[term]["search_cnt"] += 1
    ...:         else:
    ...:             a[term]["search_cnt"] = 1
    ...:     for term in set(terms):
    ...:         if "user_cnt" in a[term]:
    ...:             a[term]["user_cnt"] += 1
    ...:         else:
    ...:             a[term]["user_cnt"] = 1

In [49]: a
Out[49]:
defaultdict(collections.defaultdict,
            {'apple': defaultdict(None, {'search_cnt': 4, 'user_cnt': 3}),
             'google': defaultdict(None, {'search_cnt': 3, 'user_cnt': 2}),
             'microsoft': defaultdict(None, {'search_cnt': 1, 'user_cnt': 1}),
             'yahoo': defaultdict(None, {'search_cnt': 3, 'user_cnt': 2})})

上面的默认字典包含您需要的计数。

我使用set第二个术语迭代的原因是,如果 1 个用户多次搜索一个术语,则该术语的用户计数不应增加 :)


推荐阅读