2017-10-27 33 views
0

値[01/8月/ 1995:00:54:59 -0400] "GET /images/opf-logo.gif HTTP/1.0" 200 32511 [01/8月/ 1995年:00:55:04 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 4635 [01/Aug/1995:00:55:06 -0400] "GET /images/ksclogosmall.gif HTTP/1.0 "403 78787累積和は

私はHTTPサーバーからのファイルを持っており、最後の列であるサイズ(バイト)の累積合計に基づいて上位10個のイメージをリストする必要があります。

li = [i.strip().split() for i in open("input.txt").readlines()] 

sorted_li = sorted(li, key = lambda cols : int(cols[6]), reverse = True) 

sorted_out = {} 

for l in sorted_li: 

    if l[3] in sorted_out: 
     sorted_out[l[3]] += int(l[6]) 
    else: 
     sorted_out[l[3]] = int(l[6]) 

どのようにして辞書のトップ10値に制限できますか?私がパンダやグループを使わずにできることはありますか?

答えて

1

標準libのCounterを使用できます。カウンターの使い方トップ10の使用にc.most_common(10)

を取得するには

from collections import Counter 

d = dict() 
with open('input.txt') as f: 
    split_line_gen = (line.strip().split() for line in f) 
    get_name_size_gen = ((line[3], int(line[-1])) for line in split_line_gen) 
    for name, size in get_name_size_gen: 
     d[name] = d.get(name, 0) + size 
    c = Counter(d) 

はビットのオーバーヘッドすることができます。代わりに、あなたは

sorted(d, key=d.get, reverse=True)[:10]リターン名前だけ

sorted(d.items(), key=lambda x: x[-1], reverse=True)[:10]リターンの名前のようなものを使用して

のサイズしかし、私はカウンターを使用することをお勧めだろうことができます - 読みやすく、芋。

+0

しかし、累積合計は上位10個のレコードしか取得しません。 – paddu

+0

@paddu申し訳ありませんが、私の悪い、ちょうど編集plsのチェック。 – ailin

+0

@paddu 'sorted'はリストを返し、ソースを変更しないので、ソート結果を使用する場合は、それを変数に代入する必要があります。つまり、' result = sorted ... ' – ailin