我有以下代码,效果很好。它从文件中获取我的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]
我觉得在这一点上我只是看错了事情,并没有看到轻松解决我的小困境。
谢谢你的帮助! 杰森
答案 0 :(得分:2)
假设count
是你的IP-> Count的词,那么:
from operator import itemgetter
sorted_counts = sorted(count.iteritems(), key=itemgetter(1))
for ip, cnt in sorted_counts:
print ip, 'had', cnt, 'results'
答案 1 :(得分:0)
因此假设您有一个字典d,其中包含IP和值是计数的键。
>>> 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')]
您还可以使用参数reverse = True来按相反的顺序对列表进行排序。
答案 2 :(得分:0)
每当我必须将字典视为数据时,我都会使用熊猫。
import pandas as pd
pd.DataFrame(list(dict.items()), columns= ['IP','count']).sort_values('count')
请注意,使用dict.items()
调用字典中的项目,然后将其传递到列表中。如果使用python 2.X,则应该省略list()
调用。