【问题标题】:sorted() function not working on numeric listsorted() 函数不适用于数字列表
【发布时间】:2021-01-25 15:51:03
【问题描述】:

我正在尝试获取目录中所有文件的顺序,因此我尝试使用 sorted() 函数对分别命名为folder/frame0.jpg 的每个文件的数值进行排序。问题是我得到的输出看起来像这样

yourlieinapril1/frame1094.jpg
yourlieinapril1/frame1095.jpg
yourlieinapril1/frame1096.jpg
yourlieinapril1/frame1097.jpg
yourlieinapril1/frame1098.jpg
yourlieinapril1/frame1099.jpg
yourlieinapril1/frame1100.jpg
yourlieinapril1/frame110.jpg
yourlieinapril1/frame1101.jpg

当它遍历一个基数为 10 的数字时,列表会返回一个较小的数字 我尝试使用以下代码修复它,但它仍然无法正常工作

def animate(folder):
    l = list()
    a = list()
    for filename in os.listdir(folder):
        path = (os.path.join(folder, filename))
        if path.endswith('jpg'):
            num = ''
            for i in range(len(path)):
                try:
                    p = int(path[i])
                    num += str(path[i])
                except:
                    pass
            try:
                check = a[len(a) - 1]
                if len(check) > len(num):
                    if num != '0':
                        num += ('0')
                        path = folder + '/frame' + num + '.jpg'
            except:
                pass
            a.append(num)
            l.append(path)
    f = sorted(l)
    f = list(dict.fromkeys(f))

有人知道我应该怎么做吗?

【问题讨论】:

标签: python sorting directory filesystems


【解决方案1】:

sorted 指定一个key 参数,告诉它如何对不同于标准字母比较的字符串进行排序。

>>> files = [
...     "yourlieinapril1/frame1094.jpg",
...     "yourlieinapril1/frame1095.jpg",
...     "yourlieinapril1/frame1096.jpg",
...     "yourlieinapril1/frame1097.jpg",
...     "yourlieinapril1/frame1098.jpg",
...     "yourlieinapril1/frame1099.jpg",
...     "yourlieinapril1/frame1100.jpg",
...     "yourlieinapril1/frame110.jpg",
...     "yourlieinapril1/frame1101.jpg",
... ]
>>> sorted(files, key=lambda s: int(s[21:-4]))
['yourlieinapril1/frame110.jpg', 'yourlieinapril1/frame1094.jpg', 'yourlieinapril1/frame1095.jpg', 'yourlieinapril1/frame1096.jpg', 'yourlieinapril1/frame1097.jpg', 'yourlieinapril1/frame1098.jpg', 'yourlieinapril1/frame1099.jpg', 'yourlieinapril1/frame1100.jpg', 'yourlieinapril1/frame1101.jpg']

如果您的真实数据集更复杂(即,前导非数字部分是可变的,并且您想对其进行排序加上数值),您的 key 函数可能会执行类似返回前导元组的操作str 和结尾的 int

【讨论】:

    【解决方案2】:

    您需要通过文件名中的数字来索引文件名(首先提取数字),然后用零填充数字,并对索引进行排序。像这样:

    import os
    
    def index_frames(folder):
        indexed_files = {}
        for filename in os.listdir(folder):
            path = (os.path.join(folder, filename))
            if path.endswith('jpg'):
                # extract the number from the filename and pad with zeros so that they will sort correctly
                num = ''.join([s for s in filename if s.isdigit()]).zfill(15)
                
                # insert into a dict with key as padded number
                indexed_files[num] = path
    
        return indexed_files
    
    index_frames = index_frames('yourlieinapril1')
    for key in sorted(index_frames.keys()):
        # these will print in order because they have been sorted by the index
        print(index_frames[key])
    
    

    【讨论】:

      猜你喜欢
      • 2011-08-07
      • 2021-07-26
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多