python - 结合列表字典的数据聚合
问题描述
我有一个包含以下内容的文件。
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
但是,如何获取每个搜索词的用户数和搜索数。
解决方案
是的,您可以使用 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 个用户多次搜索一个术语,则该术语的用户计数不应增加 :)
推荐阅读
- firebase - Firebase.initializeApp() 给出错误:空值检查运算符用于空值
- c# - 如何随机激活 2 个游戏对象?
- javascript - Next.js:您可能需要适当的加载器来处理此文件类型,目前没有配置加载器来处理此文件
- r - ggarrange 始终用轴标题覆盖右下 x 轴
- maple - 在 Maple 中,当使用 plot3d 绘制参数和笛卡尔坐标表面的组合时,如何指定 x、y 和 t 的范围?
- compiler-errors - 为什么 NVCC 对 constexpr 比非 constexpr 主机函数更严格?
- java - 检查西班牙身份证信的Java程序
- security - OWASP ZAP API 根元素丢失错误
- php - PHP 脚本创建文件但归 www-data 所有。现在无法删除
- python - 拆分多页 Tiff 文件并将每个帧/页面保存为 Tiff