Сортировка файлов определенным образом - PullRequest
0 голосов
/ 26 ноября 2018

В моем каталоге есть список файлов, и теперь я хочу сохранить содержимое в базе данных.Однако до этого мне нужно отсортировать их в правильном порядке.

Текущий порядок выглядит следующим образом:

['8.txt', '8-0.txt', '8-1.txt', '8-2.txt', '8-0-0.txt', '8-0-1.txt',
 '8-0-2.txt', '8-0-3.txt', '8-1-0.txt', '8-2-0.txt', '8-2-1.txt']

И я бы хотел, чтобы они упорядочивались следующим образом:

['8.txt', '8-0.txt', '8-0-0.txt', '8-0-1.txt', '8-0-2.txt', '8-0-3.txt', 
 '8-1.txt', '8-1-0.txt', '8-2.txt', '8-2-0.txt', '8-2-1.txt']

По сути, рассматривайте эти файлы как посты,комментарии и ответы.

Первый файл «8.txt» без тире - это оригинальное сообщение.После этого у нас есть группа комментариев, например, «8-0.txt», «8-1.txt» и т. Д., То есть одна черта в именах файлов.Наконец, для каждого комментария могут быть некоторые ответы, имеющие формат имени «8-2-0.txt», «8-2-1.txt», (2 черточки).

Хотя я знаю, что способ грубой силы определенно может выполнять такой порядок, мне интересно, есть ли какие-либо пифоновские способы (например, некоторые лямбда-функции в функции для сортировки)

Пока мы можем предположить, что существует только до2 тире в именах файлов, т.е. не более 3 уровней иерархии.

Любая помощь будет очень ценится!

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Естественная сортировка включает и другие, и другие.

0 голосов
/ 26 ноября 2018

Трудность заключается в правильной сортировке вещей, подобных

8-1-12.txt   # simply removing non digits ==> 8112 
8-11-2.txt   # simply removing non digits ==> 8112 as well

Простое решение - использовать tuple - сортировка:

f = ['8.txt', '8-0.txt', '8-0-0.txt', '8-0-1.txt', '8-0-2.txt', '8-0-3.txt', 
     '8-1.txt', '8-1-0.txt', '8-2.txt', '8-2-0.txt', '8-2-1.txt','8-12-0.txt',
     '8-1-12.txt', '8-11-2.txt']

def to_tuple(text):
    """Extract all numbers from file as tuple (8,1,3) ... etc."""
    return tuple(map(int, text.split(".")[0].split("-") ))

f.sort(key = to_tuple)
print(f)

Вывод:

['8.txt', '8-0.txt', '8-0-0.txt', '8-0-1.txt', '8-0-2.txt', '8-0-3.txt', 
 '8-1.txt', '8-1-0.txt', '8-1-12.txt', 
 '8-2.txt', '8-2-0.txt', '8-2-1.txt', 
 '8-11-2.txt', '8-12-0.txt']

Если в ваших именах есть вещи, которые не являются неразборчивыми, вам нужно использовать try: except: и усовершенствовать функцию to_tuple(), чтобы правильно обрабатывать ваши имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...