我有一个元组列表:
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轴是与每个日期相关联的数字?
答案 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_)
这些年来 - 它们比季度更重要。