【问题标题】:Sort list of strings by integer suffix按整数后缀对字符串列表进行排序
【发布时间】:2010-11-26 16:59:57
【问题描述】:

我有一个字符串列表:

[song_1, song_3, song_15, song_16, song_4, song_8]

我想按最后的 # 对它们进行排序,不幸的是,由于较小的数字不是“08”而是“8”,因此按字典顺序它们被视为大于 15。

我知道我必须将一个键传递给排序函数,我在这个网站的某个地方看到了这个来对作为字符串的十进制数字进行排序:

sorted(the_list, key=lambda a:map(int,a.split('.'))

但那是针对“1.2、2.5、2.3”的,但我没有这种情况。我想更换'。使用 '_' 但据我了解,它将双方都转换为 ints,这将失败,因为 _ 的左侧是一个字符串。

编辑:我忘了说所有的前缀都是一样的(本例中的歌曲)

【问题讨论】:

    标签: python


    【解决方案1】:

    你已经接近了。

    sorted(the_list, key = lambda x: int(x.split("_")[1]))
    

    应该这样做。这会在下划线处拆分,获取第二部分(即第一个下划线之后的部分),并将其转换为整数以用作键。

    【讨论】:

      【解决方案2】:

      好吧,你想先按文件名排序,然后按 int 部分:

      def splitter( fn ):
          try:
              name, num = fn.rsplit('_',1)  # split at the rightmost `_`
              return name, int(num)
          except ValueError: # no _ in there
              return fn, None
      
      sorted(the_list, key=splitter)
      

      【讨论】:

        【解决方案3】:
        sorted(the_list, key = lambda k: int(k.split('_')[1]))
        

        【讨论】:

          【解决方案4】:
          def number_key(name):
             parts = re.findall('[^0-9]+|[0-9]+', name)
             L = []
             for part in parts:
                 try:
                    L.append(int(part))
                 except ValueError:
                    L.append(part)
             return L
          sorted(your_list, key=number_key)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-06-10
            • 2012-04-03
            • 1970-01-01
            • 2018-07-02
            • 2014-04-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多