3

我有一个字符串列表,每个字符串都是格式几乎完全相同的电子邮件。每封电子邮件中都有很多信息,但最重要的信息是设施名称和事件日期。

我希望能够获取该电子邮件列表,并创建一个新列表,其中电子邮件根据“location_substring”分组在一起,然后再次为“incident_date_substring”排序,以便来自一个位置的所有电子邮件按时间顺序在列表中组合在一起。

设施子字符串通常可以在每封电子邮件的主题行中找到。事件日期可以在电子邮件中以“事件日期:”开头的一行中找到。

关于我将如何做这件事的任何想法?

4

3 回答 3

5

编写一个函数,从每封电子邮件中返回您关心的两条信息:

def email_sort_key(email):
    """Find two pieces of info in the email, and return them as a tuple."""
    # ...search, search...
    return "location", "incident_date"

然后,将该函数用作排序的键:

emails.sort(key=email_sort_key)

排序键函数应用于所有值,并根据键函数返回的值对值重新排序。在这种情况下,key 函数返回一个元组。元组按字典顺序排列:找到第一个不相等的元素,然后在比较不相等的元素时比较元组。

于 2012-12-08T18:27:34.370 回答
0

您的解决方案可能如下所示:

def getLocation (mail): pass
    #magic happens here

def getDate (mail): pass
    #here be dragons

emails = [...] #original list

#Group mails by location
d = {}
for mail in emails:
    loc = getLocation (mail)
    if loc not in d: d [loc] = []
    d [loc].append (mail)

#Sort mails inside each group by date
for k, v in d.items ():
    d [k] = sorted (v, key = getDate)
于 2012-12-08T18:27:09.477 回答
0

这是你可以做的事情:

from collections import defaultdict
from datetime import datetime
import re

mails = ['list', 'of', 'emails']

mails2 = defaultdict(list)

for mail in mails:
    loc = re.search(r'Subject:.*?for\s(.+?)\n', mail).group(1)
    mails2[loc].append(mail)

for m in mails2.values():
    m.sort(key=lambda x:datetime.strptime(re.search(r'Date of Incident:\s(.+?)\n',
                                                    x).group(1), '%m/%d/%Y'))

请注意,对于正则表达式不匹配的情况,这绝对没有错误处理。

于 2012-12-08T20:19:03.377 回答