2013-11-20 116 views
0

我有元組的列表:每個元組的第一個元素排序元組的名單 - 的Python 2.7

lst = [('Q4-2005', 327.93), ('Q1-2005', 133.05), ('Q3-2005', 500.95), ('Q2-2005', 254.22)] 

我想每個元組的第一個元素進行排序這個列表。因此,我的結果,排序列表應該看起來像:

[('Q1-2005', 133.05), ('Q2-2005', 254.22), ('Q3-2005', 500.95), ('Q4-2005', 327.93)] 

我試着做這個使用排序()和lambda,但結果列表不排序。林想它,因爲我的「日期」實際上是字符串:

sorted(lst, key = lambda x: x[0]) 

,所以我想我有2個問題..

首先,我如何元組的列表,他們是按時間順序排序?

其次,讓python意識到'Q1-2005'是約會的最好方法是什麼?最終我想繪製這個數據,其中x軸是'日期',y軸是與每個日期關聯的數字?

回答

2

你說你希望Python將Q1-2005解釋爲日期。如果將列表轉換爲這種格式,則排序變得微不足道,而且繪圖也會更容易。這裏有一種方法可以使用datetime.date(它將季度編碼爲表示季度的第一個日期的日期)。

from datetime import date 

# date() takes in year, month, day args 
date_lst = [(date(int(q[3:]), 3 * int(q[1]) - 2, 1), v) 
      for q, v in lst] 

這將導致這樣的事情:

[(datetime.date(2005, 10, 1), 327.93), 
(datetime.date(2005, 1, 1), 133.05), 
(datetime.date(2005, 7, 1), 500.95), 
(datetime.date(2005, 4, 1), 254.22)] 

之後,按時間順序排序作爲sorted(date_lst)一樣簡單。

1

重新定義排序的最好方法是創建一個新類或新函數。 Python中的默認排序算法使用傳統的詞典排序。調用排序(元組)將按字母/字母數字順序排序,但不一定是您想要的順序。

我會注意到,默認排序會根據它們的索引[0]值對元組進行排序,如果兩個第一個索引相同,那麼只會索引[1]。

1

不要命名您的變量列表!

sorted(the_list, key=lambda x: list(reversed(map(int,x[0][1:].split("-"))))) 
+0

固定我不得不調用逆序迭代器的列表...爲什麼不給名稱變量列表的好例子 –

+1

多個驚歎號? Hrm,Terry Pratchett有話要說這些.. :-P –

+0

pep8建議'='周圍沒有空格 –

0

使用對象與__lt__和/或__cmp__將是一件好事,但如果你想用一鍵功能:

#!/usr/local/cpython-3.3/bin/python 

list_ = [('Q4-2005', 327.93), ('Q1-2005', 133.05), ('Q3-2005', 500.95), ('Q2-2005', 254.22), ('Q1-2006', 123.45), ('Q2-2007', 678.90), ] 

def key(element): 
    subresult1 = element[0] 
    subresult2 = subresult1.split('-') 
    subresult2.reverse() 
    subresult2[0] = int(subresult2[0]) 
    return subresult2 

list_.sort(key=key) 
print(list_) 

其中出於對年 - 他們比宿舍更爲顯著。

相關問題