我有一份表格' Season Year':
['Fall 2014', 'Spring 2015', 'Fall 2008', 'Spring 2008']
排序时,列表应如下所示:
['Spring 2015', 'Fall 2014', 'Spring 2008', 'Fall 2008']
因此,排序规则是:
首先按年排序
按季节排序:'春季'然后'秋天'
我目前有一个名为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
...
这适用于按年份排序,但不适用于本季,即使我已指定了这种类型的排序。为什么会这样?
答案 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)