Массив строк, отсортированный сначала по менее конкретному совпадению

У меня есть список файлов с именами:

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 - эта терминология также будет оценена по достоинству. Я предполагаю, что что-то вроде этого вопроса задавалось раньше, но у меня возникли проблемы с формулировкой правильного запроса.)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать шаблон (?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)

Ответ принят как подходящий

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']

Другие вопросы по теме