2013-11-20 117 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_) 

其中出于对年 - 他们比宿舍更为显著。

相关问题