[英]Sort list of tuples by month python
我有元組中的假期列表:
holidays = [('Easter', ('Apr', 1), 0),
('Earth Day', ('Apr', 22), 0),
('Pearl Harbor Rememberance Day', ('Dec', 7), 0),
('Christmas Day', ('Dec', 25), 50),
('Groundhog Day', ('Feb', 2), 0)]
以及對它們進行排序的功能:
def holiday1(holidays : [(str,(str,int),int)]) -> [(str,(str,int),int)]:
return sorted(holidays, key=lambda x:x[1])
我按字母順序按月分類,但我想按月份的位置對它們進行排序。 (例如Jan = 1,Feb = 2等)
我已經為這幾個月創建了一本字典:
months = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
我不確定如何使用dict'months'來排序元組列表,以便結果如下:
holidays = [('Groundhog Day', ('Feb', 2), 0),
('Easter', ('Apr', 1), 0),
('Earth Day', ('Apr', 22), 0),
('Pearl Harbor Rememberance Day', ('Dec', 7), 0),
('Christmas Day', ('Dec', 25), 50)]
我們排序的元素是3元組,其中第二個元素也是元組。 我們感興趣的是月份,它是元組第二個元素的第一個元素,所以我們可以用x[1][0]
來訪問它。 但是我們當然不希望按字母順序排序,但是按月的順序排序,所以我們可以用months[x[1][0]]
執行查找。 因此,我們可以排序只服用一個月到帳戶:
# only taking month into account
return sorted(holidays, key=lambda x: months[x[1][0]])
但我的猜測是,如果出現平局 ,你需要考慮這一天。 關於元組的好處是,如果你比較它們,Python將首先包含兩個元組的第一個元素。 如果是平局,它將比較兩個元組的第二個元素等。我們可以通過讓key
返回2元組來使用它:首先是月份的索引,然后是日期:
# taking month and day into account
return sorted(holidays, key=lambda x: (months[x[1][0]], x[1][1]))
編輯 :如果您希望按月份和日期相同的方式按名稱對假期進行排序,我們可以構建3元組:
# taking month, day and name into account
return sorted(holidays, key=lambda x: (months[x[1][0]], x[1][1], x[0]))
使用鍵功能對要排序的對象進行排名。
def by_month(holiday):
"""sort by month, then day, then name of holiday"""
holiday_name = holiday[0]
month, day = holiday[1]
month_value = months[month]
return month_value, day, holiday_name
sorted(holidays, key=by_month)
輸出將是
[('Groundhog Day', ('Feb', 2), 0),
('Easter', ('Apr', 1), 0),
('Earth Day', ('Apr', 22), 0),
('Pearl Harbor Rememberance Day', ('Dec', 7), 0),
('Christmas Day', ('Dec', 25), 50)]
不要使用ad-hoc數據結構和值來表示假日,而是定義其值正確行為的類型。
首先,創建幾個月的專用類型,而不是僅使用常規字符串。
from enum import IntEnum, auto, unique, EnumMeta
Month = IntEnum('Month',
"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split())
接下來,定義一個表示假日的類,而不是使用普通元組。
from functools import total_ordering
@total_ordering
class Holiday:
def __init__(self, name, month, day, x):
self.name = name
self.month = month
self.day = day
self.x = x
self.sort_key = (self.month, self.day, self.name)
def __lt__(self, other):
return self.sort_key < other.sort_key
def __eq__(self, other):
return self.sort_key == other.sort_key and self.x == other.x
def __str__(self):
return "{} ({} {})".format(self.name, self.month._name_, self.day)
現在您的假期可以排序而無需任何進一步的努力:
holidays = [
Holiday('Easter', Month.Apr, 1, 0),
Holiday('Earth Day', Month.Apr, 22, 0),
Holiday('Pearl Harbor Rememberance Day', Month.Dec, 7, 0),
Holiday('Christmas Day', Month.Dec, 25, 50),
Holiday('Groundhog Day', Month.Feb, 2, 0)
]
for h in sorted(holidays):
print(h)
輸出
Groundhog Day (Feb 2)
Easter (Apr 1)
Earth Day (Apr 22)
Pearl Harbor Rememberance Day (Dec 7)
Christmas Day (Dec 25)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.