我有一个字符串列表,每个字符串都是以几乎完全相同的方式格式化的电子邮件。每封电子邮件中都有大量信息,但最重要的信息是设施名称和事件日期。
我希望能够获取该电子邮件列表,并创建一个新列表,其中电子邮件根据" location_substring"组合在一起。然后再次排序" incident_date_substring"这样,来自一个位置的所有电子邮件将按时间顺序组合在列表中。
设施子字符串通常可以在每封电子邮件的主题行中找到。事件日期可以在电子邮件中的一行中找到,该行以:"事件发生日期:"。
关于我如何做到这一点的任何想法?
答案 0 :(得分:4)
编写一个函数,从每封电子邮件中返回您关注的两条信息:
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)
排序键功能应用于所有值,并根据键功能返回的值重新排序值。在这种情况下,键函数返回一个元组。按字典顺序排列元组:找到第一个不相等的元素,然后将元组进行比较,因为不等元素比较。
答案 1 :(得分: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)
答案 2 :(得分: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'))
请注意,对于正则表达式不匹配的情况,这绝对没有错误处理。