@zeni1agent

Как изменить по имени сортировку списка?

Мой код
import os
path = os.path.dirname(os.path.abspath(__file__))
path2 = path + "\\images\\"
lst = os.listdir(path2)
lst.sort()


for filename in lst:
    print(filename)

Я пытаюсь получить список всех картинок по имени но вместо
0 (1).png 0 (2).png 0 (3).png 0 (4).png 0 (5).png

Я получаю
0 (1).png 0 (10).png 0 (100).png 0 (101).png 0 (102).png

Я не понимаю почему так происходит и как это исправить.
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ответы на вопрос 3
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
1.Код не рабочий. Откуда берется path2?
2.Интерпретатор сравнивает посимвольно, слева направо. И для него '0 (10).png' "меньше" чем '0 (2).png'.
Исправить это можно, переименовав числа так, чтобы в каждом названии было равное количество разрядов (001 ... 043 ... 102)
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Потому что сортировка строк (например, имён файлов) - это лексикографическое сравнение. В этом сравнении "б" > "аааааааааа", просто потому что "б" > "а". Другое дело, что у человеков очень странные представления о порядке, и компьютеру трудно к ним адаптироваться.

Если тебе нужен т.н. естественный порядок (natural sorting), тебе нужно как-то выцепить из имени тот кусок, по которому нужно делать сравнение. Например, так:
import re
PARTS = re.compile(r'^(.+?)(?:(\d+)\D+)?$')

def natural_sort_key(fname: str):
    "Функция извлекает из имени файла описание, по которому его надо сортировать."
    prefix, index = PARTS.match(fname).groups()
    return (prefix, int(index) if index else 0)


lst.sort(key=natural_sort_key)
Ответ написан
@zeni1agent Автор вопроса
Не знаю насколько мой метод рабочий но я написал вот такой сортировщик

import re
lst.sort(key=lambda x: int(re.findall(r'-?\d+\.?\d*', x.split(' ')[1])[0]))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы