如何在Python中访问和修改复杂的列表/字典数据结构?

时间:2013-10-29 19:14:50

标签: python python-2.6

我正在尝试分析Web服务器日志以获取IP地址,用户代理,请求路径数据。我想存储特定IP访问的不同路径。此外,一些客户端欺骗用户代理,因此IP可以呈现许多用户代理字符串。我想为每个IP存储此用户代理和路径数据。

现在我已经创建了如下数据结构:

ip_dict[ip_address] = [ total_count_int, [{'path_name_1': path_name_1-count_int }, {'path_name_2': path_name_2_count} ], [ {'crawler': crawler_count_int} ]  ]

列表中的第一项 - 请求总数
列表中的第二项 - {'visited site path' : count }的列表 列表中的第三项 - {'visited user agent' : count }

列表

但是,实现它以修改现有项目变得越来越复杂。如果各个关键元素匹配,我想增加计数。

任何有关创建更好的数据结构或修改上述数据结构中元素的帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

似乎就像你想要的词汇一样:

def update(ip_dict, ip_address, site_path, user_agent):
    if ip_address in ip_dict:
        ip_entry = ip_dict[ip_address]

        ip_entry['total_count'] += 1

        if site_path in ip_entry['site_paths']:
            ip_entry['site_paths'][site_path] += 1
        else:
            ip_entry['site_paths'][site_path] = 0

        if user_agent in ip_entry['user_agents']:
            ip_entry['user_agents'][user_agent] += 1
        else:
            ip_entry['user_agents'][user_agent] = 0
    else:
        ip_dict[ip_address] = {
            'total_count': 1,
            'site_paths': {site_path: 1},
            'user_agent': {user_agent: 1}
        }

# initialize the ip dict
ip_dict = {}

# read from your log file and for every entry, call
update(ip_dict, '1.2.3.4', site_path, user_agent)

当然,您可以使用defaultdict对此进行优化,但这超出了此问题的范围。