用于字符串的Python自定义排序功能,例如' Season Year'

时间:2015-08-03 18:22:25

标签: python sorting

我有一份表格' Season Year':

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

排序时,列表应如下所示:

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

因此,排序规则是:

  1. 首先按年排序

  2. 按季节排序:'春季'然后'秋天'

  3. 我目前有一个名为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
    ... 
    

    这适用于按年份排序,但不适用于本季,即使我已指定了这种类型的排序。为什么会这样?

3 个答案:

答案 0 :(得分:5)

只需使用-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)

即使你使用{{1}},你的功能也无法正常工作,因为你传递单个字符串,所以你没有a和b来分割。这也适用于python 2或3。

答案 1 :(得分:2)

其中一个错误是你没有正确检查是否平等。您在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)

结果:

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

如果你想玩迭代器:

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)

答案 2 :(得分:0)

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

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)

对数据进行排序