【问题标题】:Python sorting problem [duplicate]Python排序问题[重复]
【发布时间】:2010-06-13 17:50:00
【问题描述】:

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

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

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

我怎样才能让它们正确排序? (按季节然后第 # 集,上升)

【问题讨论】:

  • 你的意思是“按季然后按剧集”对吗?我认为第 2 季和第 3 季的第 1 集不应该放在一起。
  • 好的,肯尼。编辑澄清。我会看看另一个问题。

标签: python sorting


【解决方案1】:

使用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)

【讨论】:

    【解决方案2】:

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

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

    2. 将所有字符串转换为“自然”排序顺序正是您想要的格式。例如,您可以像“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)))
    

    【讨论】:

    • 谢谢。我在构建函数的过程中完成了一半,然后感到沮丧并使用了链接的 natsorted 方法。基础扎实!
    • cmp 在 Python3 中消失了,所以习惯使用 key 是一个好主意(而且效率更高)
    【解决方案3】:

    由于您是按字符串排序的,因此“1”在“10”之前,因此您预期的剧集将不会按正确的顺序排列。解决方案是将字符串拆分为其组成部分,即将季节和剧集作为整数,将它们放在关联数据结构中,然后按相关整数排序。要将字符串拆分为各个部分,请查看Python's Regular Expressions,投射季节编号和剧集编号as integers,然后选择您喜欢的数据结构并将整数键与字符串相关联。按键排序,就完成了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      相关资源
      最近更新 更多