代码之家  ›  专栏  ›  技术社区  ›  robev

在python中按整数后缀对字符串列表排序

  •  5
  • robev  · 技术社区  · 14 年前

    我有一个字符串列表:

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

    最后,我想把它们归类为“α”,不幸的是,较低的数字不是“08”,而是“8”,它们按字典顺序被视为大于15。

    我知道我必须向sort函数传递一个键,我在这个站点的某个地方看到了这样一个键来对字符串形式的十进制数进行排序:

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

    但那是“1.2,2.5,2.3”,但我没有那个案子。我想用'.'替换'.',但根据我的理解,它将两边都转换为int,这将失败,因为'.'的左边是一个字符串。

    任何帮助都将不胜感激

    编辑 :我忘了提到所有前缀都是相同的(本例中是song)

    4 回复  |  直到 14 年前
        1
  •  14
  •   unwind    14 年前

    你很接近。

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

    应该这么做。这将在下划线上拆分,将第二部分(即第一个下划线之后的部分)转换为整数,用作键。

        2
  •  5
  •   Jochen Ritzel    14 年前

    好吧,首先要按文件名排序,然后在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
  •  3
  •   GWW    14 年前
    sorted(the_list, key = lambda k: int(k.split('_')[1]))
    
        4
  •  1
  •   Rosh Oxymoron    14 年前
    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)