data = 112*'cms017 R\n'
data = data + '''atl001 I
cms017 R
atl001 I
cms017 H
atl001 R
lhcabc003 H
cms017 R
lhcabc003 H
lhcabc003 R
cms017 R
cms017 R
cms017 R'''
print data,'\n'
stats = {}
d = {'I':0,'R':1,'H':2}
L = 0
for line in data.splitlines():
user,irh = line.split()
stats.setdefault(user,[0,0,0])
stats[user][d[irh]] += 1
L = max(L, len(user))
LL = len(str(max(max(stats[user])
for user in stats )))
cale = ' %%%ds %%%ds %%%ds' % (LL,LL,LL)
ch = 'user'.ljust(L) + cale % ('I','R','H')
print '%s\n%s' % (ch, len(ch)*'=')
print '\n'.join(user.ljust(L) + cale % tuple(stats[user])
for user in sorted(stats.keys()))
结果
user I R H
=====================
atl001 2 1 0
cms017 0 117 1
lhcabc003 0 1 2
.
还:
data = 14*'cms017 R\n'
data = data + '''atl001 I
cms017 R
atl001 I
cms017 H
atl001 R
lhcabc003 H
cms017 R
lhcabc003 H
lhcabc003 R
cms017 R
cms017 R
cms017 R'''
print data,'\n'
Y = {}
L = 0
for line in data.splitlines():
user,irh = line.split()
L = max(L, len(user))
if (user,irh) not in Y:
Y.update({(user,'I'):0,(user,'R'):0,(user,'H'):0})
Y[(user,irh)] += 1
LL = len(str(max(x for x in Y.itervalues())))
cale = '%%-%ds %%%ds %%%ds %%%ds' % (L,LL,LL,LL)
ch = cale % ('user','I','R','H')
print '%s\n%s' % (ch, len(ch)*'=')
li = sorted(Y.keys())
print '\n'.join(cale % (a[0],Y[b],Y[c],Y[a])
for a,b,c in (li[x:x+3] for x in xrange(0,len(li),3)))
结果
user I R H
==================
atl001 2 1 0
cms017 0 19 1
lhcabc003 0 1 2
.
PS:
用户名全部用 L 个字符对齐
在我的代码中,为避免塞巴斯蒂安代码中的复杂性,在我的代码中,I、R、H 以相同数量的 LL 字符对齐,这是此列中所有结果的最大值