2014-11-17 71 views
3

长列表包含一些要排序的元素。按组件列表排序字符串

实际上每个元素都有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", 
... 
...] 

感谢。

回答

7

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

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

键函数返回一个元组。元组按照字典顺序进行比较;第一项是比较;如果它们是相同的,则比较第二项,等等。 [1]

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

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"], ...] 

如果要改回原来的形式,你可以join他们:

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

我觉得应该是'X [0],x [3],x [2],x [1]'如果你想尊重OP的排序顺序。 – Thibaut

+0

@Thibaut是的,我刚刚编辑它。谢谢! – parchment

+0

谢谢,羊皮纸。这真太了不起了。 –

0

通过将密钥函数传递给其内置的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)