2012-12-11 54 views
0

我有(在我看来)是一个相当复杂的问题。我会尽量简洁 - 尽管为了充分理解问题,您可能需要点击我的配置文件,然后查看我在StackOverflow上发布的(只有其他)两个问题。简而言之:我有两个列表 - 一个是包含电子邮件字符串的列表,其中包含设施名称和事件日期。另一个是每个电子邮件的设施ID(我使用以下正则表达式函数之一来获取此列表)。我用Regex能够搜索每个字符串的这些信息。 3层正则表达式的功能是:还具有格式化这样的字典结合两个列表并通过引用对字典进行排序Python

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.} 

我想和排序键值在字典中结合两个列表,然后是事件发生日期。由于键值附加在设施名称上,因此应自动将来自同一设施的电子邮件分组在一起。为了做到这一点,我已经尝试使用这两个功能:

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,其他则完全是随机的。我不知道为什么会发生这种情况,但我有一种感觉,它与我将两个列表合并的方式有关。任何人都可以帮助这低n00b?谢谢!!!

+1

的问题是有点难以理解的最后一个元素的列表。你能告诉我们一些示例输入,你得到的输出和你想要的输出吗? – stranac

+0

你有一堆电子邮件,但你想与他们做什么?从中提取数据,替换一些代码并将结果输出到列表中? – RickyA

+0

“我有两个列表 - 一个是包含电子邮件字符串,其中包含设施名称和事件发生日期。”好的,第二个列表呢?它看起来不像你在任何地方描述它。 – Kevin

回答

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)] 

不过,既然你是从第二个建设的第一个列表中,它可能是有意义的直接建设相结合的版本,而不是进行单独的列表,然后将它们合并一个单独的步骤。这里有一个更新列表理解上面那张权的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更长或更短,则需要对其进行调整。

+0

上帝......你是一个天才。现在在工作,所以不能测试这个。但这看起来很有希望!我将在今天晚些时候回家后检查,并会回复!谢谢!!!!! – hillmandj

+0

这工作!!!!!!谢谢! – hillmandj

0

所以,这是我认为正在发生的事情。请尽可能纠正我。 'incident_list'是电子邮件字符串的列表。您进入并在每封电子邮件中查找设施名称,因为您的外部字典具有(key:value)=(设施ID:设施名称)。从字典中,您可以在此'id_list'中提取设施ID。

您将列表合并,以便获取字符串列表[facility id + email,...] 然后您希望它通过元组(设施ID,发生日期)进行排序。

看起来您正在搜索设施ID和设施名称两次。如果他们相同,你可以跳过一个步骤。那么,最好的办法就是用元组做这一切在一次:

 
incident_list = ['email1', 'email2',...] 

unsorted_list = [] 
for email in incident list: 
    id = find_facility_id(email) 
    date = 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字符串),然后第二个元素(日期作为字符串排序元组的一个简单的列表)。如果你只需要一个字符串列表(ID +电子邮件),那么你就需要与每个元组部分

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

+0

这可能会有所帮助...但不确定它是如何解决设施ID和电子邮件之间的配对不正确匹配的(是有问题的)。 – hillmandj

相关问题