2014-11-17 102 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)