【问题标题】:How can I sort a python list of files by ordered list of file extensions [duplicate]如何按文件扩展名的有序列表对python文件列表进行排序[重复]
【发布时间】:2019-04-05 21:35:41
【问题描述】:

如何根据指定的顺序或文件扩展名对文件列表进行排序?我这样做的原因是因为我想遍历文件,然后按优先级顺序处理它们。在这种情况下是FBX。作为最后的手段,我会使用 EXR。

files = [
    'Z:/users/john/apples.jpg',
    'Z:/users/john/apples.fbx',
    'Z:/users/john/apples.exr',
    'Z:/users/john/apples.abc',
]

ext = ['fbx','abc', 'jpg', 'exr']`

期望的目标

>>> files = [
    'Z:/users/john/apples.fbx',
    'Z:/users/john/apples.abc',
    'Z:/users/john/apples.jpg',
    'Z:/users/john/apples.exr',
]

【问题讨论】:

    标签: python


    【解决方案1】:

    在查找list 中使用键index 进行排序,

    >>> import os
    >>> files
    ['Z:/users/john/apples.jpg', 'Z:/users/john/apples.fbx', 'Z:/users/john/apples.exr', 'Z:/users/john/apples.abc']
    >>> ext = ['fbx', 'abc', 'jpg', 'exr']
    >>> sorted(files, key=lambda x: ext.index(os.path.splitext(x)[1].strip('.'))) # noqa
    ['Z:/users/john/apples.fbx', 'Z:/users/john/apples.abc', 'Z:/users/john/apples.jpg', 'Z:/users/john/apples.exr']
    

    处理,丢失的键,

    >>> files.append('foo.bar')
    >>> keys = {k: v for v, k in enumerate(ext)}
    >>> sorted(files, key=lambda x: keys.get(os.path.splitext(x)[1].strip('.'), float('inf')))
    ['Z:/users/john/apples.fbx', 'Z:/users/john/apples.abc', 'Z:/users/john/apples.jpg', 'Z:/users/john/apples.exr', 'foo.bar']
    

    【讨论】:

    • 非常聪明的方法。我想对我来说将它变成一个函数来考虑预定义列表中可能不存在的 ext 对我来说是最安全的,因为我希望这些是最后的。
    • 是的,我没想到缺少分机。让它有点棘手哈哈。
    • @JokerMartini 更新,它可以处理丢失的密钥
    【解决方案2】:

    您可以创建一个将扩展映射到索引以用作排序键的字典:

    indices = {k: i for i, k in enumerate(ext)}
    sorted(files, key=lambda s: indices[s.rsplit('.', 1)[1]])
    

    这会返回:

    ['Z:/users/john/apples.fbx', 'Z:/users/john/apples.abc', 'Z:/users/john/apples.jpg', 'Z:/users/john/apples.exr']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 2018-07-03
      • 2021-05-05
      • 2011-08-25
      • 2016-04-01
      相关资源
      最近更新 更多