Python自定义的字符串排序函数,比如'Season Year'

2024-09-30 18:30:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份“季节-年份”表:

['Fall 2014', 'Spring 2015', 'Fall 2008', 'Spring 2008']

排序后,列表应该如下所示:

['Spring 2015', 'Fall 2014', 'Spring 2008', 'Fall 2008']

因此,排序规则如下:

  1. 第一次按年份排序

  2. 按季节排序:“春季”然后“秋季”

我现在有一个名为lcmp的函数,我在我的列表中使用如下:myList.sort(lcmp)。在

>>> def lcmp(a,b):
...     c = a.split()
...     d = b.split()
...     if(c[1]>d[1]):
...             if(c[0]>d[0]):
...                     return 1
...             else:
...                     return -1
...     else:
...             if(c[0]>d[0]):
...                     return 1
...             else:
...                     return 0
... 

这适用于按年份排序,但不适用于季节,尽管我已经指定了这种排序类型。为什么会这样?在


Tags: 函数列表returnif排序规则sortelse
3条回答

还应考虑比较值相等的情况:

def lcmp(a,b):
    c = a.split()
    d = b.split()
    if c[1] > d[1]:
        return 1
    elif c[1] == d[1]:
        if c[0] > d[0]:
            return -1
        elif c[0] == d[0]:
            return 0
        else:
            return 1
    else:
        return -1

然后可以使用myList.sort(lcmp)myList.sort(cmp=lcmp)对数据进行排序

其中一个错误是你没有正确检查相等性。当c[1] < d[1]c[0] < d[0]时返回什么?答案是零,这是不正确的。您还应该在sort中声明cmp参数。你可以做的是:

seasons = {
    'Spring': 1,
    'Summer': 2,
    'Fall': 3,
    'Winter': 4,
}
def lcmp(a, b):
    a_season, a_year = a.split()
    b_season, b_year = b.split()
    return int(b_year) - int(a_year) or seasons[a_season] - seasons[b_season]

l = ['Fall 2014', 'Spring 2015', 'Fall 2008', 'Spring 2008']
l.sort(cmp=lcmp)

结果:

^{pr2}$

如果你想玩迭代器:

from itertools import ifilter, izip

def lcmp(a, b):
    it = (
        f(y) - f(x)
        for x, y, f in izip(
            reversed(a.split()),
            reversed(b.split()),
            (int, lambda _: -seasons[_])
        )
    )
    return next(ifilter(None, it), 0)

只需使用-year将sort by year反转为第一个键,seas != "Spring"的结果使用key=sort_function来打破联系。在

l = ['Fall 2014', 'Spring 2015', 'Fall 2008', 'Spring 2008']
def key(x):
    seas,year = x.split()
    return -int(year), seas != "Spring"

l.sort(key=key)

即使使用myList.sort(key=lcmp),函数也无法工作,因为您传递的是单个字符串,因此没有a和b可拆分。这也适用于Python2或3。在

相关问题 更多 >