Сортировка списка по имени файла - PullRequest
1 голос
/ 25 апреля 2020

Я читаю в именах файлов некоторые изображения, которые хранятся так:

(path/to/images/1_1.png)
(path/to/images/1_2.png) ...
(path/to/images/10_1.png) ...
(path/to/images/1000_1.png)

При чтении имен файлов в список с этим кодом

import cv2
import glob

folders = glob.glob(r'C:\Users\tobis\OneDrive\Desktop\Masterarbeit\data\2017-IWT4S-CarsReId_LP-dataset\*')
imagenames_list = []
for folder in folders:
    for f in glob.glob(folder+'/*.png'):
        imagenames_list.append(f)

Первое изображение в моем список - это имя файла (path/to/images/1000_1.png) вместо (path/to/images/1_1.png). Важно получить файлы в правильном порядке, потому что мне нужно сопоставить изображения с другим списком. Есть ли способ отсортировать список так, как мне нужно?

Ответы [ 2 ]

3 голосов
/ 25 апреля 2020

То, что вы имеете в виду, называется естественной сортировкой, а не лексикографической сортировкой по умолчанию.

Вот пример, который, я думаю, удовлетворит ваши потребности.

import re

def natural_sort(l):
    convert = lambda text: int(text) if text.isdigit() else text.lower()
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
    return sorted(l, key = alphanum_key)

fl = ['path/to/images/1000_1.png', 'path/to/images/1_1.png']

print(natural_sort(fl))

ссылка : Есть ли встроенная функция для естественной сортировки строк?

1 голос
/ 25 апреля 2020

Отличный вопрос!

См. Этот рабочий пример:

sorted(['path/to/images/1000_1.png',
        'path/to/images/1_1.png',
        'path/to/images/1_2.png',
        'path/to/images/10_1.png'
       ], 
        key=lambda x: int(x.split('/')[-1][:-4].replace('_','')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...