2013-01-15 117 views
4

我有一個從上午8點到下午7點的字符串格式的列表。 am/pm沒有指定,並且使用24小時時鐘不是選項。我想按時間對這個列表進行排序,但是我在時鐘觸發之後遇到問題,因爲數字排序從一開始,儘管事實上8-12實際上是在時間之前。我想我可以創建一個新的元組列表,我通過一個函數將時間轉換爲更合適的數字,對它進行排序,並在需要的函數中使用元組的第一個元素。這看起來似乎有用,但我擔心我可能會錯過更優雅和更基本的東西。我是嗎?列表的複雜排序

+0

爲什麼不只是存儲的數字的格式,更適合於排序,然後將它們轉換上飛?一個自然的選擇是'日期時間'對象。 –

回答

5

使用key參數至list.sort()sorted()函數提供一個值進行排序。

values.sort(key=somefunction) 

其中somefunction帶一個參數(要轉換的值)。

該列表將根據key參數的返回值進行排序,但原始值本身保持不變。

對於你的問題,你就可以使用:

def daytime(val): 
    hour, min = map(int, val.split(':')) 
    if hour < 8: 
     hour += 12 
    return hour, min 

這將改變8:01(8, 1)6:25(18, 25),造成.sort()sorted()排序8:016:25

>>> sorted(['1:14', '8:01', '12:46', '6:25'], key=daytime) 
['8:01', '12:46', '1:14', '6:25'] 

Python Sorting HOWTO欲瞭解更多詳情和提示(使用此Google cache link直到wiki.python.org已從最近的security exploit中恢復)。

4

函數to_minutes將字符串轉換爲整數小時和分鐘,並計算從8:00開始的分鐘數,在8:00之前添加12小時。然後根據這個數分鐘的排序:

def to_minutes(s): 
    h,m = map(int, s.split(':')) 
    return ((h - 8) % 12) * 60 + m 

a = ['1:45', '8:00', '6:15', '12:30'] 
print sorted(a, key=to_minutes) 

打印

['8:00', '12:30', '1:45', '6:15']