gpt4 book ai didi

python - 添加键的值并根据键在 Python 字典列表中的出现对其进行排序

转载 作者:太空狗 更新时间:2023-10-29 18:26:08 25 4
gpt4 key购买 nike

我真的是 Python 的新手,我遇到了以下需要解决的问题。我有一个来自 Apache Log 的日志文件,如下所示:

[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 3635
[01/Aug/1995:00:55:06 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 403 298
[01/Aug/1995:00:55:09 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635
[01/Aug/1995:00:55:18 -0400] "GET /images/opf-logo.gif HTTP/1.0" 200 32511
[01/Aug/1995:00:56:52 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635

我必须返回请求最多的 10 个对象及其累计传输的字节数。我只需要包含具有成功 (HTTP 2xx) 响应的 GET 请求。

所以上面的日志会导致:

/images/ksclogosmall.gif 10905
/images/opf-logo.gif 65022

到目前为止,我有以下代码:

import re
from collections import Counter, defaultdict
from operator import itemgetter
import itertools
import sys

log_file = "web.log"
pattern = re.compile(
r'\[(?P<date>[^\[\]:]+):(?P<time>\d+:\d+:\d+) (?P<timezone>[\-+]?\d\d\d\d)\] '
+ r'"(?P<method>\w+) (?P<path>[\S]+) (?P<protocol>[^"]+)" (?P<status>\d+) (?P<bytes_xfd>-|\d+)')

dict_list = []

with open(log_file, "r") as f:
for line in f.readlines():
if re.search("GET", line) and re.search(r'HTTP/[\d.]+"\s[2]\d{2}', line):
try:
log_line_data = pattern.match(line)
path = log_line_data["path"]
bytes_transferred = int(log_line_data["bytes_xfd"])
dict_list.append({path: bytes_transferred})
except:
print("Unexpected Error: ", sys.exc_info()[0])
raise
f.close()

print(dict_list)

此代码打印以下字典列表。

[{'/images/opf-logo.gif': 32511}, 
{'/images/ksclogosmall.gif': 3635},
{'/images/ksclogosmall.gif': 3635},
{'/images/opf-logo.gif': 32511},
{'/images/ksclogosmall.gif': 3635}]

我不知道如何从这里开始得到结果:

/images/ksclogosmall.gif 10905
/images/opf-logo.gif 65022

这个结果基本上是将对应于相似键的值相加,这些值按照特定键以降序顺序出现的次数排序。

注意:我尝试使用 colllections.Counter 没有用,这里我想按键出现的次数排序。

如有任何帮助,我们将不胜感激。

最佳答案

您可以使用 collections.Counter 和更新它来为每个对象添加传输的字节数:

from collections import Counter
c = Counter()
for d in dict_list:
c.update(d)
occurrences=Counter([list(x.keys())[0] for x in dict_list])
sorted(c.items(), key=lambda x: occurrences[x[0]], reverse=True)

输出:

[('/images/ksclogosmall.gif', 10905), ('/images/opf-logo.gif', 65022)]

关于python - 添加键的值并根据键在 Python 字典列表中的出现对其进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45197389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com