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

先按不太特定的匹配进行排序的字符串数组

  •  1
  • shea  · 技术社区  · 1 年前

    我有一个文件列表,命名如下:

    file1.jpg
    file2.jpg
    .
    .
    .
    

    偶尔会有重复,因此正确的顺序应该是:

    fileN.jpg
    fileN 1.jpg
    fileN 2.jpg
    

    :

    fileN 1.jpg
    fileN 2.jpg
    fileN.jpg
    

    注意,在我的用例中,字符串 fileN 可以包含特殊字符(包括空格)。使用下面的python脚本,我几乎得到了我想要的东西,但对于特殊的重复情况(即,上面的后一个例子而不是前面的例子),排序不正确。

    import os;
    files = os.listdir(os.path.curdir)
    files.sort()
    for file in files:
        print(file)
    

    如何获得正确的排序,如我的第二个代码片段所示?(我相信我正在寻找的排序有一个更优雅的CS名称,这个术语也会受到赞赏。我想以前也有人问过这样的问题,但我在制定正确的查询时遇到了问题。)

    3 回复  |  直到 1 年前
        1
  •  2
  •   John Kugelman Michael Hodel    1 年前

    sort 采取可选 key 函数,用于控制排序顺序。

    您可以使用将文件拆分为名称和扩展名 .split('.') 。这转了 file1 1.jpg 进入 ['file 1', 'jpg'] 不是永久性的;只是暂时为了排序的目的。Python自然会 ['file1', 'jpg'] 在…前面 ['file1 1', 'jpg'] ,给你想要的排序顺序。

    >>> files.sort(key=lambda name: name.split('.'))
    >>> files
    ['file1.jpg', 'file1 1.jpg', 'file1 2.jpg', 'file2.jpg', 'file2 1.jpg', 'file2 2.jpg']
    
        2
  •  0
  •   user24714692    1 年前

    你可以使用图案( ?i)([^\r\n]*)?([0-9]*)\.(?:jpe?g|png|gif) )分割文件名,然后将其作为密钥传递给 sort() 方法

    import os, re
    
    
    def _order(s):
        p = re.findall(r'(?i)([^\r\n]*)?([0-9]*)\.(?:jpe?g|png|gif)', s)
        if p:
            base, num = p[0][0], int(p[0][1]) if p[0][1] else 0
            return (base, num)
        return (s, 0)
    
    
    files = os.listdir(os.path.curdir)
    # files = ['fileN.jpg', 'fileN 1.jpg', 'fileN 2.jpg']
    files.sort(key=_order)
    for file in files:
        print(file)
    
    
        3
  •  -1
  •   hawk    1 年前

    您可以找到有趣的正则表达式,检查fileN字符串是否遵循某个路径,并在代码中使用它们来组织列表。 https://www.w3schools.com/python/python_regex.asp