0

私は(私には)かなり複雑な問題を抱えています。できるだけ簡潔にしようと思いますが、問題を完全に理解するには、プロフィールをクリックして、StackOverflowに投稿した(他の)2つの質問を確認する必要があるかもしれません。つまり、2つのリストがあります。1つは施設名とインシデントの日付を含む電子メール文字列で構成されています。もう1つは、各電子メールのファシリティIDで構成されています(このリストを取得するには、次の正規表現関数のいずれかを使用します)。私はRegexを使用して、これらの情報の各文字列を検索できるようにしました。3つの正規表現関数は次のとおりです。

def find_facility_name(incident):

    pattern = re.compile(r'Subject:.*?for\s(.+?)\n')
    findPat1 = re.search(pattern, incident)
    facility_name = findPat1.group(1)

    return facility_name



def find_date_of_incident(incident):


    pattern = re.compile(r'Date of Incident:\s(.+?)\n')
    findPat2 = re.search(pattern, incident)
    incident_date = findPat2.group(1)

    return incident_date

def find_facility_id(incident):
    pattern = re.compile('(\d{3})\n')
    findPat3 = re.search(pattern, incident)
    f_id = findPat3.group(1)

    return f_id

次のような形式の辞書もあります。

d = {'001' : 'Facility #1', '002' : 'Another Facility'...etc.}

2つのリストを組み合わせて、辞書のキー値、続いてインシデントの日付で並べ替えようとしています。キー値は施設名に添付されているため、これにより、同じ施設からの電子メールが自動的にグループ化されます。そのために、次の2つの関数を使用してみました。

def get_facility_ids(incident_list):
'''(lst) -> lst

Return a new list from incident_list that inserts the facility IDs from the
get_facilities dictionary into each incident.

'''
f_id = []
for incident in incident_list:
    find_facility_name(incident)
    for k in d:
        if find_facility_name(incident) == d[k]:
            f_id.append(k)

return f_id

id_list = get_facility_ids(incident_list)

def combine_lists(L1, L2):
    combo_list = []
    for i in range(len(L1)):
        combo_list.append(L1[i] + L2[i])

return combo_list

combination = combine_lists(id_list, incident_list)

def get_sort_key(incident):
'''(str) -> tup

Return a tuple from incident containing the facility id as the first
value and the date of the incident as the second value.

'''

return (find_facility_id(incident), find_date_of_incident(incident))

final_list = sorted(combination, key=get_sort_key)

これが私の入力と望ましい出力の例です:

d = {'001' : 'Facility #1', '002' : 'Another Facility'...etc.}
input: first_list = ['email_1', 'email_2', etc.]
first output: next_list = ['facility_id_for_1+email_1', 'facility_id_for_2 + email_2', etc.]
DESIRED OUTPUT: FINAL_LIST = sorted(next_list, key=facility_id, date of incident)

唯一の問題は、キーの値が個々の電子メール文字列にあるものと適切に一致していないことです。一部のDO、その他は完全にランダムです。なぜこれが起こっているのかわかりませんが、2つのリストを組み合わせる方法と関係があると感じています。誰かがこの低いn00bを助けることができますか?ありがとう!!!

4

2 に答える 2

0

だから、これが私が起こっていると思うことです。できれば訂正してください。'incident_list'は、電子メール文字列のリストです。(key:value)=(facility id:facility name)を持つ外部辞書があるため、各電子メールにアクセスして施設名を見つけます。辞書から、この「id_list」で施設IDを抽出できます。

リストを組み合わせて文字列のリストを取得します[施設ID+電子メール...]次に、タプル(施設ID、発生日)で並べ替えます。

施設IDと施設名を2回検索しているようです。それらが同じである場合は、ステップをスキップできます。次に、タプルを使用して一度にすべてを実行するのが最善の方法です。

Incident_list = ['email1'、'email2'、...]

unsorted_list = []
インシデントリストの電子メールの場合:
    id = find_facility_id(email)
    日付=find_date_of_incident(email)
    mytuple =(id、date、id + email)
    unsorted_list.append(mytuple)

final_list =sorted(unsorted_list、key = lambda mytup:(mytup [0]、mytup [1]))

次に、最初の要素(文字列としてのid)、次に2番目の要素(文字列としての日付)でソートされたタプルの簡単なリストを取得します。文字列のリスト(id + email)だけが必要な場合は、各タプル部分の最後の要素を含むリストが必要です。

FINALLIST = [ tup[-1] for tup in final_list ]

于 2012-12-11T17:28:09.960 に答える
0

まず、IDから名前への辞書を逆にすることをお勧めします。キーによる値の検索は非常に高速ですが、値によるキーの検索は非常に低速です。

rd = { name: id_num for id_num, name in d.items() }

次に、最初の関数をリスト内包に置き換えることができます。

id_list = [rd[find_facility_name(incident)] for incident in incident_list]

これにより、結果の値がめちゃくちゃになる理由も明らかになる可能性があります。インシデントに辞書にないファシリティ名がある場合、このコードはKeyError(古い関数はそれをスキップするだけですが)を発生させます。

あなたのcombine関数はPythonの組み込み関数と非常によく似ていzipます。私はそれを次のように置き換えます:

combination = [id+incident for id, incident in zip(id_list, incident_list)]

ただし、最初のリストを2番目のリストから作成しているため、個別のリストを作成してから別の手順でそれらを組み合わせるのではなく、組み合わせたバージョンを直接作成する方が理にかなっている場合があります。上記のリスト内包表記の更新は、combination結果に直結します。

combination = [rd[find_facility_name(incident)] + incident
               for incident in incident_list]

並べ替えを行うには、解析してIDを再度見つけるのではなく、電子メールメッセージの前に付けたID文字列を使用できます。

combination.sort(key=lambda x: (x[0:3], get_date_of_incident(x)))

3スライス内のは、の例に基づいており"001""002"id値として使用されます。実際のIDが長いまたは短い場合は、それを調整する必要があります。

于 2012-12-11T16:24:49.633 に答える