按月份python对元组列表排序

2024-09-29 23:16:34 发布

您现在位置: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)]

以及对它们进行排序的函数:

^{pr2}$

我把它们按字母顺序按月份排序,但我想按月份的位置来排序。(例如,一月=1,二月=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)]

Tags: 排序holidaysaprfebdec元组harborday
3条回答

我们排序的元素是三元组,其中第二个元素又是一个元组。我们对month感兴趣,它是元组的第二个元素的第一个元素,因此我们可以使用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元组:首先是月份的索引,然后是日期:

^{pr2}$

编辑:如果您想按名称对假日进行排序,如果月份和日期都相等,我们可以构造三元组:

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

输出将是

^{pr2}$

与其使用特别的数据结构和值来表示假日,不如定义其值行为正确的类型。在

首先,创建一个数月的专用类型,而不是仅仅使用常规字符串。在

from enum import IntEnum, auto, unique, EnumMeta

Month = IntEnum('Month',
        "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split())

接下来,定义一个类来表示假日,而不是使用普通元组。在

^{pr2}$

现在,您的假期可以进行排序,无需进一步努力:

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)

相关问题 更多 >

    热门问题