按元组的第一个元素排序元组列表 - Python 2.7

时间:2013-11-20 22:15:57

标签: python

我有一个元组列表:

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

我尝试使用sorting()和lambda执行此操作,但结果列表未排序。我正在思考它,因为我的约会和#39;实际上是字符串:

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

所以我想我有2个问题..

首先,如何对元组列表进行排序,使其按时间顺序排列?

第二,让python意识到' Q1-2005'的最佳方法是什么?是约会?最终我想绘制这个数据,其中x轴是' date'和y轴是与每个日期相关联的数字?

4 个答案:

答案 0 :(得分: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 :(得分:1)

重新定义排序的最佳方法是创建新类或新函数。 Python中的默认排序算法使用传统的词典排序。调用sort(元组)将按字母/字母数字顺序对它们进行排序,但不一定是您想要的顺序。

我会注意到,默认情况下排序将根据索引[0]值对元组进行排序,如果两个第一个索引相同,则仅转换为索引[1]。

答案 2 :(得分:1)

不要命名你的变量列表!!!

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

答案 3 :(得分: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_)

这些年来 - 它们比季度更重要。