Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python按子字符串对字符串列表进行排序_Python_String_List_Sorting_Substring - Fatal编程技术网

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

使用Python按子字符串对字符串列表进行排序,python,string,list,sorting,substring,Python,String,List,Sorting,Substring,我有一个字符串列表,每个字符串都是一封格式几乎完全相同的电子邮件。每封电子邮件中都有很多信息,但最重要的信息是设施的名称和事件日期 我希望能够获取该电子邮件列表,并创建一个新列表,其中电子邮件根据“位置\日期\子字符串”分组在一起,然后根据“事件\日期\子字符串”再次排序,这样来自一个位置的所有电子邮件将按时间顺序分组在列表中 设施子字符串通常可以在每封电子邮件的主题行中找到。可以在电子邮件中以“事件日期:”开头的一行中找到事件日期 关于我该如何做这件事,你有什么想法吗?你的解决方案可能是这样的

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

我希望能够获取该电子邮件列表,并创建一个新列表,其中电子邮件根据“位置\日期\子字符串”分组在一起,然后根据“事件\日期\子字符串”再次排序,这样来自一个位置的所有电子邮件将按时间顺序分组在列表中

设施子字符串通常可以在每封电子邮件的主题行中找到。可以在电子邮件中以“事件日期:”开头的一行中找到事件日期


关于我该如何做这件事,你有什么想法吗?

你的解决方案可能是这样的:

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)

编写一个函数,返回每封电子邮件中您关心的两条信息:

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)

排序键函数应用于所有值,并根据键函数返回的值对值重新排序。在这种情况下,key函数返回一个元组。元组按字典顺序排列:找到第一个不相等的元素,然后元组与不相等的元素进行比较。

您可以这样做:

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

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

老实说,我是新手,不知道如何处理。我认为应该定义一个函数,从每个字符串中提取设备名称。然后创建另一个提取日期的函数。然后使用sorted()方法将它们作为键或其他什么…但我真的不知道!python中常用的一种称为decorate-sort-undecorate的习惯用法。你知道什么是正则表达式吗?(这并不意味着冒犯,如果你不知道这是什么,谷歌是一个很好的图坦卡蒙。)因为这是解决你问题的方法。首先用正则表达式搜索位置,然后建立一个字典,用位置作为键,用电子邮件列表作为值。我知道正则表达式是什么。实际上,我有一个字典,其中设施的名称作为值,设施ID作为键,我从一个文本文件中提取,并将其放在一起。这样做的目的是为了程序的后续步骤。听起来你是在建议我创建一个新的,但我没有想到。@Pryd:如果你发一封示例电子邮件,我会看看我是否能为你编写一些基本代码。好的,这就是我在前面的评论中讨论的内容。问题是,这个函数看起来像什么?它需要正则表达式吗?@mrpryd这个问题是关于列表排序的,还是关于从每封电子邮件中可靠地提取相关信息的?两者都需要:P最终目标是对列表排序。但要做到这一点,您必须事先从列表的每个元素中提取信息。在这一点上,我相信正则表达式是一种方式…基于我上面发布的假电子邮件示例。然后这个答案会起作用,我最终不必做所有这些,但正则表达式显然是继续提取姓名和日期的方法。我可能会继续使用发布的其他一些答案,只是因为它更简单——但您的正则表达式模式允许我轻松提取信息。你能详细解释一下你是如何把这些模式组合起来的吗?我可以使用re.compile(r'dateofincident:.*?(\d\d\d\d\d\d\d)对事件日期进行编码,这与您所做的类似。但我还是不太明白每一件事。但愿正则表达式更简单!我得重新回答这个问题。。。