使用OrderedDict对实例进行计数



我试图使用OrderedDict()来跟踪单词的实例。我有按天组织的数据,我想计算当天"foo"的实例数。每行按日索引。使用defaultdict可以得到我想要的,但是,当然,没有排序:

from collections import defaultdict
counter = defaultdict(int)
w = open('file.txt', 'r')
y = w.readlines()
for line in y:
    day,words = line[:6], line[14:]
    if re.search(r"foo", words):
        counter[day] += 1

如果我使用OrderedDict,我怎么能做同样的事情,这样我就可以让数据按照读取的方式排序?如果我使用

for key, value in sorted(counter.items()):
    print(key, value)

然后我得到按字母顺序排列的列表。我知道我可以将天数读取到数组中,然后在此基础上迭代键,但是,这似乎非常低效。

假设我的文本文件是这样的:

Sep 1, 2014, 22:23 - ######: Here is a foo
Sep 1, 2014, 22:23 - ######: Not here
Sep 2, 2014, 19:09 - ######: foo sure
Sep 2, 2014, 19:57 - ######: footastic
Sep 2, 2014, 19:57 - ######: foo-king awesome
Sep 2, 2014, 19:57 - ######: No esta aqui

我想让我的字典打印:

('Sep 1,', 1)
('Sep 2,', 3)

您可以检查day是否在OrderedDict中。如果是,添加到它,如果不是设置为1

counter = OrderedDict()
w = open('file.txt', 'r')
y = w.readlines()
for line in y:
    day,words = line[:6], line[14:]
    if re.search(r"foo", words):
        if day in counter:
            counter[day] += 1
        else:
            counter[day] = 1

当然,OrderedDict将按照源文本文件中每天第一次出现的时间排序。

相反,您可以考虑将日期解析为日期时间。Date对象,并使用它作为defaultdict上的键。然后,您可以对键进行排序,并按日期/时间顺序获得所有项—无论它们在源文本文件中出现的顺序如何。


正如@user2357112在评论中指出的那样,在增加计数器时可以使逻辑更简单。这样的:

counter = OrderedDict()
w = open('file.txt', 'r')
y = w.readlines()
for line in y:
    day,words = line[:6], line[14:]
    if re.search(r"foo", words):
        counter[day] = counter.get(day, 0) + 1

您可以定义自己的类,同时继承defaultdictOrderedDict

class OrderedDefaultDict(defaultdict, OrderedDict):
    def __init__(self, default, *args, **kwargs):
        defaultdict.__init__(self, default)
        OrderedDict.__init__(self, *args, **kwargs)
counter = OrderedDefaultDict(int)

相关内容

  • 没有找到相关文章

最新更新