import sys
import datetime
import time
'''
体育 xxxshow pv 2
体育 xxxshow uv auncee
体育 xxxclick pv 3
体育 xxxclick uv ancdejx
体育 yyyrecshow pv 5
体育 yyyrecshow uv aunceed
体育 yyyrecclick pv 2
体育 yyyrecclick uv ancdejs
体育1 xxxshow pv 2
体育1 xxxshow uv auncee
体育1 xxxclick pv 3
体育1 xxxclick uv ancdejx
体育1 yyyrecshow pv 5
体育1 yyyrecshow uv aunceed
体育1 yyyrecclick pv 2
体育1 yyyrecclick uv ancdejs
输出样例
体育 7 5 2 2 showpv clickpv showusr clickusr
'''
def reduce():
frontType = None #类别
showpv = 0
clickpv = 0
showusr = 0
clickusr = 0
cs = set() #去除重复的click usrid
ss = set() #去除重复的show usrid
for line in sys.stdin:
currentType,actionType,puType,reactionType = None,None,None,None
try:
currentType,actionType,puType,reactionType = line.split()
except:
pass
# 处理
if currentType == frontType: #如果当前类型和前一个类型相同,说明处理的键相同
if actionType[-1] == 'w': #如果动作类型是show
if puType == 'pv': #如果是pv量
showpv += int(reactionType)
else:
if reactionType not in ss: #如果usrid不在集合中
ss.add(reactionType)
showusr += 1
else: #如果动作类型是click
if puType == 'pv': #如果是pv量
clickpv += int(reactionType)
else:
if reactionType not in cs: #如果usrid不在集合中
cs.add(reactionType)
clickusr += 1
else: #如果当前类型和之前的类型不同,有两种情况:1.frontType = None or key different
cs.clear() #清空集合
ss.clear()
if frontType: #如果之前的类型不为None说明计算到下一个key
print('%s\t%s\t%s\t%s\t%s'%(frontType,showpv,clickpv,showusr,clickusr))
frontType = currentType
showpv = 0 #重置计数,重新准备计算当前key
clickpv = 0
showusr = 0
clickusr = 0
if actionType[-1] == 'w': #如果动作类型是show
if puType == 'pv': #如果是pv量
showpv += int(reactionType)
else:
ss.add(reactionType)
showusr += 1
else:
if puType == 'pv': #如果是pv量
clickpv += int(reactionType)
else:
cs.add(reactionType)
clickusr += 1
print('%s\t%s\t%s\t%s\t%s'%(frontType,showpv,clickpv,showusr,clickusr))
reduce()
方法2:
map阶段可以划分为key = '体育',value = 'xxxshow pv 2'
然后在reduce阶段在分割value,再继续统计