基于某些列值的累积总和

时间:2017-10-27 13:30:21

标签: python cumulative-sum

  

[01 / Aug / 1995:00:54:59 -0400]“GET /images/opf-logo.gif HTTP / 1.0”200   32511 [01 / Aug / 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 个答案:

答案 0 :(得分:1)

您可以使用标准库中的Counter

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)

前10名使用c.most_common(10)

使用计数器可能有点开销。相反,你可以使用像

这样的东西

sorted(d, key=d.get, reverse=True)[:10]仅返回姓名

sorted(d.items(), key=lambda x: x[-1], reverse=True)[:10]返回姓名和尺寸

但我建议使用Counter - 更具可读性,imo。