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

1

そのため、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')]

パラメータ reverse=True を使用して、リストを逆順でソートすることもできます。

于 2013-07-20T21:29:09.100 に答える
0

辞書をデータとして扱わなければならないときはいつでも、パンダを使用します。

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 に答える