2013-07-20 55 views
0

我有下面的代码很好用。它将我的IP地址从一个文件中取出并计算它们出现在日志文件中的次数。基于计数的字典排序

def count_ips(): 
    fp=open('logfile','r') 
    store=[] 
    while 1: 
      line=fp.readline() 
      if not line: 
        break 
      if line[-1:] == '\n': 
        line=line[:-1] 
      data1=line.split('"') 
      data2=data1[0].split(' ') 
      store.append({'IP':data2[0],'Date':data2[3]+' '+data2[4],'Action':' '.join(data1[1:-2]),'Browser':' '.join(data1[-2:])}) 
    fp.close() 
    count={} 
    for i in store: 
      if i['IP'] in count: 
        count[i['IP']] +=1 
      else: 
        count[i['IP']] =1 

    avg=0 
    cnt=0 
    for i in count: 
      avg+=count[i] 
      cnt+=1 
    avg=avg/cnt 
    print 'average hit is: %i' % avg 

    for i in count: 
      if count[i] > 10: 
        print i +' %i' % count[i] 
count_ips() 

我真的不知道我是如何得到这一点,但在这一节。在打印出来之前,我想按计数进行排序。底部最大的数字。

for i in count: 
      if count[i] > 10: 
        print i +' %i' % count[i] 

我觉得在这一点上我只是看着事情错了,没有看到我的小难题的简单解决方案。

谢谢你的帮助! 杰森

回答

2

假设count是你的IP-的字典>计数,然后:

from operator import itemgetter 
sorted_counts = sorted(count.iteritems(), key=itemgetter(1)) 
for ip, cnt in sorted_counts: 
    print ip, 'had', cnt, 'results' 
+0

有时我觉得我永远不会得到这个。非常感谢您的帮助! – JasonOrtiz

0

所以假设你有哪些含有对IP和值是计数键的字典d。

>>> d = {'1.1.1.1':5, '2.2.2.2':4} 

这里是什么,我会在一个班轮做:

>>> sorted((d[ip], ip) for ip in d) 
[(4, '2.2.2.2'), (5, '1.1.1.1')] 

您还可以使用参数反向= true来排序以相反的顺序列表。