可能重复:
Python analog of natsort function (sort a list using a “natural order” algorithm)
我确信这很简单,但我无法弄清楚。我有一个这样的字符串列表(在使用sort之后):
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
如何让它们正确分类? (按季节然后剧集#,升序)
答案 0 :(得分:3)
使用key
参数sort
函数指定要用于排序的密钥。
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 :(得分:1)
有两种方法可以解决这个问题:
定义你自己的排序函数cmp(x,y),其中x和y是字符串,如果第二个大于第一个,则返回1,如果第一个大于1,则返回-1,如果第一个大于,则返回0他们是一样的。然后将此函数作为“cmp”参数传递给内置的sort()函数。
将所有字符串转换为“自然”排序顺序正是您想要的格式。例如,你可以像“第03季,第07集”一样对它们进行零填充。然后你可以使用sort()对它们进行排序。
无论哪种方式,我建议使用简单的正则表达式来获取字符串中的季节和剧集,例如:
m = re.match('Season ([0-9]+), Episode ([0-9]+): .*', s)
(season, episode) = (int(m.group(1)), int(m.group(2)))
答案 2 :(得分:1)
由于您按字符串排序,“1”出现在“10”之前,因此您的预期剧集将不会按正确顺序排列。解决方案是将字符串拆分为其组成部分,即将季节和剧集作为整数,将它们放在关联数据结构中,然后按相关整数排序。要将字符串拆分为其部分,请查看Python's Regular Expressions,投射季节编号和剧集编号as integers,然后选择您喜欢的数据结构并将整数键与字符串相关联。按键排序,你就完成了。