使用Python按子串排序字符串列表

时间:2012-12-08 17:23:12

标签: python string list sorting substring

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

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

设施子字符串通常可以在每封电子邮件的主题行中找到。事件日期可以在电子邮件中的一行中找到,该行以:"事件发生日期:"。

关于我如何做到这一点的任何想法?

3 个答案:

答案 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'))

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