2010-06-13 80 views
1

可能重复:
Python analog of natsort function (sort a list using a “natural order” algorithm)Python的排序问题

我敢肯定,这是简单的,但我无法弄清楚。我有这样的字符串列表(使用后排序):

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

你的意思是“按季节*然后*按情节”吧?我不认为第2季和第3季的第1集应该走到一起。 – kennytm 2010-06-13 17:51:18

+0

对,肯尼。编辑澄清。我会看看另一个问题。 – matt 2010-06-13 17:56:55

回答

1

有两种方法可以解决这个:

  1. 定义自己的排序功能CMP(X,Y),其中x和y是字符串,返回如果第二个大于第一个,则为1;如果第一个大于第一个,则为-1;如果它们相同,则为0。然后将此函数作为“cmp”参数传递给内置的sort()函数。

  2. 将所有字符串转换为“自然”排序顺序正是您想要的格式。例如,你可以像“第3季,第07集”那样将它们零填充。然后你可以使用sort()对它们进行排序。

无论哪种方式,我建议使用一个简单的正则表达式来获得季和剧集出字符串的,是这样的:

m = re.match('Season ([0-9]+), Episode ([0-9]+): .*', s) 
(season, episode) = (int(m.group(1)), int(m.group(2))) 
+0

谢谢。我通过构建函数的一半获得了沮丧,并使用了链接的natsorted方法。虽然坚实的基础! – matt 2010-06-13 18:28:37

+0

'cmp'在Python3中消失了,所以习惯使用'key'是一个好主意(并且更有效率) – 2010-06-13 21:19:37

0

既然你被串排序,“1 “在”10“之前出现,因此您的预定剧集将不会按照正确的顺序播放。解决方案是将字符串拆分为其组成部分,即将季节和剧集作为整数,将它们放入关联数据结构中,然后按相关整数排序。要将字符串拉到其部分中,请检查Python's Regular Expressions,将季节编号和片段编号as integers,然后选择一个您喜欢的数据结构,并将整数键与字符串相关联。按键排序,就完成了。

3

使用函数的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)