Python排序问题

Python排序问题,python,sorting,Python,Sorting,可能重复: 我相信这很简单,但我想不出来。我有一个这样的字符串列表(使用排序后): 我怎样才能使它们正确地分类呢?(按季节,然后按情节#,上升)有两种方法来实现这一点: 定义自己的排序函数cmp(x,y),其中x和y是字符串,如果第二个大于第一个,则返回1;如果第一个大于,则返回1;如果它们相同,则返回0。然后将此函数作为“cmp”参数传递给内置的sort()函数 将所有字符串转换为“自然”排序顺序正是您想要的格式。例如,你可以像“第三季第七集”那样对它们进行零填充。然后可以使用sort()对

可能重复:

我相信这很简单,但我想不出来。我有一个这样的字符串列表(使用排序后):


我怎样才能使它们正确地分类呢?(按季节,然后按情节#,上升)

有两种方法来实现这一点:

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

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

  • 无论哪种方式,我建议使用一个简单的正则表达式将季节和插曲从字符串中去掉,例如:

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

    有两种方法可以实现这一点:

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

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

  • 无论哪种方式,我建议使用一个简单的正则表达式将季节和插曲从字符串中去掉,例如:

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

    因为您是按字符串排序的,“1”在“10”之前,所以您想要的剧集顺序不正确。解决方案是将字符串拆分为其组成部分,即以整数形式获取季节和剧集,将它们放置在关联数据结构中,然后按相关整数排序。要将字符串拆分为多个部分,请检查并转换季号和集号,然后选择您喜欢的数据结构,并将整数键与字符串关联。按键排序,您就完成了。

    因为您按字符串排序,“1”在“10”之前,所以您预定的剧集顺序不正确。解决方案是将字符串拆分为其组成部分,即以整数形式获取季节和剧集,将它们放置在关联数据结构中,然后按相关整数排序。要将字符串拆分为多个部分,请检查并转换季号和集号,然后选择您喜欢的数据结构,并将整数键与字符串关联。按键排序就完成了。

    使用
    排序
    函数的
    参数指定要用于排序的键

    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)
    

    使用
    排序
    函数的
    参数指定要用于排序的键

    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)
    

    你是说“按季然后按集”对吗?我不认为第二季和第三季的第一集应该放在一起。对,肯尼。编辑以澄清。我来看看另一个问题。你是说“按季然后按集”对吗?我不认为第二季和第三季的第一集应该放在一起。对,肯尼。编辑以澄清。我再看另一个问题。谢谢。我在构建一个函数的过程中走了一半,然后感到沮丧,并使用了链接的natsorted方法。但是坚实的基础!code>cmp已经在Python3中消失了,所以习惯使用
    键是一个好主意(而且效率更高)
    谢谢。我在构建一个函数的过程中走了一半,然后感到沮丧,并使用了链接的natsorted方法。但是坚实的基础!code>cmp在Python3中已经消失了,所以习惯使用
    key
    是一个好主意(而且效率更高)