![](/img/trans.png)
[英]Python3: Sorting a list of tuples by datastamp contained in first element of tuple
[英]Sorting list of tuples by first element of each tuple - 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)]
我嘗試使用sorting()和lambda進行此操作,但結果列表未排序。 我之所以這樣想是因為我的“日期”實際上是字符串:
sorted(lst, key = lambda x: x[0])
所以我想我有2個問題。
首先,如何對元組列表進行排序,使它們按時間順序排列?
其次,使python意識到“ Q1-2005”是日期的最佳方法是什么? 最終我想繪制此數據,其中x軸是“日期”,y軸是與每個日期關聯的數字?
您說過要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)
就像sorted(date_lst)
一樣簡單。
重新定義排序的最佳方法是創建新類或新函數。 Python中的默認排序算法使用傳統的字典排序。 調用sort(tuple)將按字母/字母數字順序對其進行排序,但不一定按您想要的順序進行。
我將注意到,默認情況下,排序將根據元組的索引[0]值對其進行排序,如果兩個第一個索引相同,則僅對索引[1]進行排序。
不要命名您的變量列表!!!
sorted(the_list, key=lambda x: list(reversed(map(int,x[0][1:].split("-")))))
將對象與__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_)
多年來,它們比宿舍更重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.