1

我有以下代码效果很好。它从文件中获取我的 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]

在这一点上,我觉得我只是在看问题,并没有看到解决我的小困境的简单方法。

谢谢你的帮助!杰森

4

3 回答 3

4

假设这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'
于 2013-07-20T21:09:15.030 回答
1

所以假设你有一个字典 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 以相反的顺序对列表进行排序。

于 2013-07-20T21:29:09.100 回答
0

每当我必须将字典视为数据时,我都会使用 pandas。

import pandas as pd
pd.DataFrame(list(dict.items()), columns= ['IP','count']).sort_values('count')

请注意,字典中的项目被调用,dict.items()然后传递给列表。如果使用 python 2.X 那么你应该省略list()调用。

于 2018-09-17T14:21:31.783 回答