簡體   English   中英

按每個元組的第一個元素對元組列表進行排序-Python 2.7

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM