【问题标题】:Sorting and Organizing a Dictionary排序和组织字典
【发布时间】:2014-01-25 01:09:23
【问题描述】:

我有一本包含很多很多键/值对的字典。

键是日期,值是全球顶级域。

我想将字典输出到一个文本文件中,以便它对相似的值进行计数和 alpha 排序,但只在同一个键内

for example:
*key:     value1:count value2:count*
date1:   au:4   be:12   com:44
date2:   az:4   com:14  net:5

代码:

with open('access_logshort.txt','rU') as f:
for line in f:
    list1 = re.search(r'(?P<Date>[0-9]{2}/[a-zA-Z]{3}/[0-9]{4})(.+)(GET|POST)\s(http://|https://)([a-zA-Z.]+)(\.)(?P<tld>[a-zA-Z]+)(/).+?"\s200',line)

    if list1 != None:
        print list1.groupdict()
        one_tuple = list1.group(1,7)
        my_dict[one_tuple[0]]=one_tuple[1]

output:
print my_dict
{'09/Mar/2004': 'hu'}
{'09/Mar/2004': 'hu'}
{'09/Mar/2004': 'com'}
{'09/Mar/2004': 'ru'}
{'09/Mar/2004': 'ru'}
{'09/Mar/2004': 'com'}

T

【问题讨论】:

  • 你的字典结构如何?像这样:{'&lt;datetime string&gt;': ['com', 'com', 'org', 'com', 'net', ...], '&lt;datetime string2&gt;: ...}?
  • 如果我 print my_dict 这是输出:{'09/Mar/2013': 'hu'} {'09/Mar/2013': 'hu'} {'09/Mar/2013': 'com'} 虽然每个条目都在新行上
  • 鉴于您的评论,您的意思是字典列表吗?
  • @kegewe:请将print my_dict 的输出粘贴到您的帖子中
  • 是的,我确实有一个字典列表

标签: python sorting text dictionary output


【解决方案1】:

这应该适合你的情况。

from collections import defaultdict
from dateutil.parser import parse
import csv
import re

data = defaultdict(lambda: defaultdict(int))

with open('access_logshort.txt','rU') as f:
    for line in f:
        list1 = re.search(r'(?P<Date>[0-9]{2}/[a-zA-Z]{3}/[0-9]{4})(.+)(GET|POST)\s(http://|https://)([a-zA-Z.]+)(\.)(?P<tld>[a-zA-Z]+)(/).+?"\s200',line)

        if list1 is not None:
            date, domain = list1.group(1,7)
            data[date.lower()][domain.lower()] += 1

with open('my_data.csv', 'wb') as ofile:
    # add delimiter='\t' to the argument list of csv.writer if you want 
    # tsv rather than csv
    writer = csv.writer(ofile)

    for key, value in sorted(data.iteritems(), key=lambda x: parse(x[0])):
        domains = sorted(value.iteritems())
        writer.writerow([key] + ['{}:{}'.format(*d) for d in domains])

输出:

10/Mar/2004,com:2,hu:2,ru:2
09/Mar/2004,com:2,hu:2,ru:2

【讨论】:

  • 我应该补充一点,我发布的 my_dict 输出是从缩短的文本文件中提取的。该程序最终将提取的文本文件长达数千行
  • 所以我添加了my_list = my_dict.items(),而不是粘贴整个列表,然后运行您的代码,但出现属性错误
  • 那是因为你的 my_dict 是一个列表,而不是一个字典 :)
  • 我真的认为有一种简单的方法可以将搜索结果添加到一个字典中,然后对结果字典进行排序。二维字典?
  • 我的更新答案确实为您提供了一种简单的方法。尝试运行我的代码的最新版本。
猜你喜欢
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多