Python排序问题
可能是重复的问题:
Python中类似natsort函数的用法(使用“自然顺序”算法对列表排序)
我知道这应该很简单,但我就是搞不定。我有一个字符串列表,像这样(在用sorted函数排序后):
Season 2, Episode 1: A Flight to Remember
Season 2, Episode 20: Anthology of Interest I
Season 2, Episode 2: Mars University
Season 2, Episode 3: When Aliens Attack
....
Season 3, Episode 10: The Luck of the Fryrish
Season 3, Episode 11: The Cyber House Rules
Season 3, Episode 12: Insane in the Mainframe
Season 3, Episode 1: The Honking
Season 3, Episode 2: War Is the H-Word
我该怎么做才能让它们正确排序呢?(先按季节,再按集数,升序排列)
3 个回答
1
因为你是按字符串排序的,所以“1”会排在“10”前面,这样你的剧集就不会按正确的顺序排列。解决这个问题的方法是把字符串拆分成几个部分,也就是把季数和集数转换成整数,然后放到一个关联的数据结构里,再按这些整数进行排序。要拆分字符串,可以看看Python的正则表达式,把季数和集数转换成整数,然后选择一个你喜欢的数据结构,把整数作为键,字符串作为值。最后按键排序,这样就完成了。
3
使用 sort
函数时,可以通过 key
参数来指定你想用来排序的关键字。
def get_sort_key(s):
m = re.match('Season ([0-9]+), Episode ([0-9]+): .*', s)
return (int(m.group(1)), int(m.group(2)))
my_list.sort(key=get_sort_key)
1
有两种方法可以解决这个问题:
你可以自己定义一个排序函数 cmp(x, y),这里的 x 和 y 是字符串。如果第二个字符串比第一个大,就返回 1;如果第一个字符串更大,就返回 -1;如果两个字符串一样,就返回 0。然后把这个函数作为 "cmp" 参数传给内置的 sort() 函数。
你也可以把所有字符串转换成一种格式,这样“自然”的排序顺序就正好是你想要的。例如,你可以把它们填充成像“Season 03, Episode 07”这样的格式。然后你就可以用 sort() 来排序了。
无论哪种方法,我建议使用一个简单的正则表达式来从字符串中提取出季和集,类似这样的:
m = re.match('Season ([0-9]+), Episode ([0-9]+): .*', s)
(season, episode) = (int(m.group(1)), int(m.group(2)))