Python 按组件对字符串列表进行排序

Python 按组件对字符串列表进行排序,python,list,Python,List,长列表包含一些要排序的元素 实际上,每个元素有4个内容:名称、输入/输出、区域、日期和时间,并用“~”连接。(可以更改“~”)我想按排序顺序重新组织列表 a_list = ["Chris~Check-in~Zoom A~11/13/2013 05:20", "Chris~Check-in~Zoom G~11/15/2013 14:09", "Frank E~Check-in~Zoom K~11/11/2013 08:48", "Frank E~Check-in~Zoom K~11/15/2013

长列表包含一些要排序的元素

实际上,每个元素有4个内容:名称、输入/输出、区域、日期和时间,并用“~”连接。(可以更改“~”)我想按排序顺序重新组织列表

a_list = ["Chris~Check-in~Zoom A~11/13/2013 05:20",
"Chris~Check-in~Zoom G~11/15/2013 14:09",
"Frank E~Check-in~Zoom K~11/11/2013 08:48",
"Frank E~Check-in~Zoom K~11/15/2013 21:32",
"Kala Lu S~Check-in~Zoom N~11/13/2013 07:20",
"Milly Emily~Check-in~Zoom G~11/13/2013 01:08",
"Milly Emily~Check-in~Zoom E~11/16/2013 14:39",
"Milly Amy~Check-in~Zoom G~11/10/2013 20:14",
"Milly Amy~Check-in~Zoom A~11/16/2013 08:55",
"Milly Amy~Check-in~Zoom O~11/14/2013 21:57",
"Milly Amy~Check-in~Zoom A~11/15/2013 10:45",
"Nago Iko~Check-in~Zoom K~11/16/2013 20:42",
"Nago Iko~Check-in~Zoom K~11/14/2013 10:46",
"Liz D~Check-in~Zoom N~11/15/2013 01:46",
"Liz D~Check-in~Zoom A~11/12/2013 09:54",
"Liz D~Check-in~Zoom G~11/16/2013 13:15",
"Chris~Check-out~Zoom A~11/13/2013 13:42",
"Chris~Check-out~Zoom G~11/11/2013 14:21",
"Chris~Check-out~Zoom G~11/16/2013 09:41",
"Frank E~Check-out~Zoom K~11/14/2013 03:02",
"House P~Check-out~Zoom K~11/10/2013 11:17",
"Kala Lu S~Check-out~Zoom G~11/11/2013 23:27",
"Kala Lu S~Check-out~Zoom N~11/14/2013 11:17"]
它可以导入MS Excel并进行排序,但我想知道Python是否可以完成这项工作

是否可以按列表中的顺序对它们进行排序:1。姓名,2。日期和时间3。第4区。输入/输出?例如:

new_list = ["Chris~Check-out~Zoom G~11/08/2014 14:21",
"Chris~Check-in~Zoom A~11/10/2014 05:20",
"Chris~Check-out~Zoom A~11/10/2014 13:42",
"Chris~Check-in~Zoom G~11/12/2014 14:09",
"Chris~Check-out~Zoom G~11/13/2014 09:41",
"Frank E~Check-in~Zoom K~11/08/2014 08:48",
"Frank E~Check-out~Zoom K~11/11/2014 03:02",
"Frank E~Check-in~Zoom K~11/12/2014 21:32",
...
...]

谢谢。

您可以拆分列表,然后使用自定义的
键进行排序。但是,您需要首先解析日期以正确排序

import datetime

new_l = sorted((x.split('~') for x in l),
               key=lambda x: (x[0],
                              datetime.datetime.strptime(x[3], '%m/%d/%Y %H:%M'),
                              x[2],
                              x[1]))
key函数返回一个元组。元组按字典顺序进行比较;比较第一项;如果它们相同,则比较第二项,依此类推

或者,您可以分阶段进行排序。这将允许您分别按升序或降序指定要排序的列

from operator import itemgetter

nl = [x.split('~') for x in l]

nl.sort(key=itemgetter(1))
nl.sort(key=itemgetter(2))
nl.sort(key=lambda x: datetime.datetime.strptime(x[3], '%m/%d/%Y %H:%M'),
        reverse=True) # Newest first
nl.sort(key=itemgetter(0))
请记住,这两种方法都会使新列表按如下方式拆分:

new_list = [["Chris", "Check-out", "Zoom G", "11/08/2014 14:21"], ...]
如果要将它们更改回原始形式,可以
加入它们:

new_list_joined = ['~'.join(x) for x in new_list]

通过将键函数传递给its内置的
sort()
方法,可以有效地对字符串列表进行排序。关键函数需要做的就是返回从单个列表项中提取的值的元组,该元组按适当的顺序排列,并在必要时转换为适当的类型进行比较:

import datetime

def custom_sort(string_list):
    def key_func(s, strptime=datetime.datetime.strptime):
        s = s.split('~')
        return s[0], strptime(s[3], '%m/%d/%Y %H:%M'), s[2], s[1]
    string_list.sort(key=key_func)

custom_sort(my_string_list)

如果你想尊重OP的排序顺序,我认为应该是
x[0]、x[3]、x[2]、x[1]
。datetime会以那种文本格式正确排序吗?顺便说一句,如果你愿意,你可以使用
itemgetter(0,3,2,1)
替换lambda<代码>来自操作员导入itemgetter
。谢谢,monkut。您可以发布您的答案,以便让更多人分享以供学习吗?@monkut-Ah,不会,因为日期格式(mm/dd/yyyy)。我修好了,谢谢。但是现在我不能使用itemgetter,因为它必须首先被解析。