基于某些列值的累计和
Cumulative sum based on certain column values
[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 个值?有没有一种方法可以不使用 pandas 和分组依据?
您可以使用标准库中的 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]
return 只有名字
sorted(d.items(), key=lambda x: x[-1], reverse=True)[:10]
return 名称和尺码
但我会推荐使用 Counter——更具可读性,imo。
[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 个值?有没有一种方法可以不使用 pandas 和分组依据?
您可以使用标准库中的 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]
return 只有名字
sorted(d.items(), key=lambda x: x[-1], reverse=True)[:10]
return 名称和尺码
但我会推荐使用 Counter——更具可读性,imo。