3

文字列のリストがあり、それぞれがほぼ同じ方法でフォーマットされた電子メールです。各メールには多くの情報が含まれていますが、最も重要な情報は施設の名前とインシデントの日付です。

その電子メールのリストを取得して、「location_substring」に基づいて電子メールをグループ化し、「incident_date_substring」で再度ソートして、1 つの場所からのすべての電子メールが時系列順にリストにまとめます。

ファシリティの部分文字列は、通常、各電子メールの件名に含まれています。インシデントの日付は、「Date of Incident:」で始まる電子メールの行に記載されています。

これをどのように行うかについてのアイデアはありますか?

4

3 に答える 3

5

各メールから気になる 2 つの情報を返す関数を作成します。

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)

ソート キー関数がすべての値に適用され、キー関数から返された値に基づいて値が並べ替えられます。この場合、キー関数はタプルを返します。タプルは辞書順で並べられます。最初の等しくない要素を見つけてから、等しくない要素が比較されるようにタプルを比較します。

于 2012-12-08T18:27:34.370 に答える
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 に答える
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 に答える