Сортировать список Python, содержащий как буквы, так и цифры

#python #python-3.x #list #sorting

#python #python-3.x #Список #сортировка

Вопрос:

У меня есть список directory_contents , который содержит:

[‘Папка 1’, ‘Папка 10’, ‘Папка 11’, ‘Папка 12’, ‘Папка 13’, ‘Папка 14’, ‘Папка 15’, ‘Папка 16’, ‘Папка 17’, ‘Папка 18’, ‘Папка 19’, ‘Папка 2’, ‘Папка 20’, ‘Папка 21’, ‘Папка 22’, ‘Папка 23’, ‘Папка 24’, ‘Папка 25’, ‘Папка 26’, ‘Папка 27’, ‘Папка 28’, ‘Папка 29’, ‘Папка 3’, ‘Папка 30’, ‘Папка 4’, ‘Папка 5’, ‘Папка 6’, ‘Папка 7’, ‘Папка 8’, ‘Папка 9’]

И мне просто нужно отсортировать его так, чтобы он выглядел в основном так, как его отображала бы Windows или любая операционная система:

введите описание изображения здесь

Чтобы это было:

[‘Папка 1’, ‘Папка 2’, ‘Папка 3’, ‘Папка 4’ и так далее…

Я пытался directory_contents.sort() , directory_contents = sorted(directory_contents) но оба не сработали.

Комментарии:

1. Прочитайте о key параметре для функций sort / sorted . Затем напишите функцию, которая извлекает номер из имени папки и использует его.

2. Поскольку все значения dictionary_contents представляют собой строки, он отсортирует их по алфавиту. Я бы посоветовал использовать что-то вроде split(), чтобы получить массив только из чисел и работать оттуда.

3. есть ли способ сделать это быстро без пользовательского кода?

Ответ №1:

сортировка по номеру:

   directory_contents = ['Folder 1', 'Folder 10', 'Folder 11', 'Folder 12', 'Folder 13', 'Folder 14', 'Folder 15', 'Folder 16', 'Folder 17', 'Folder 18', 'Folder 19', 'Folder 2', 'Folder 20', 'Folder 21', 'Folder 22', 'Folder 23', 'Folder 24', 'Folder 25', 'Folder 26', 'Folder 27', 'Folder 28', 'Folder 29', 'Folder 3', 'Folder 30', 'Folder 4', 'Folder 5', 'Folder 6', 'Folder 7', 'Folder 8', 'Folder 9']
  directory_contents.sort(key=lambda x: int(x.strip('Folder')))
 

Кроме того, это немного быстрее:

 timeit("""directory_contents = ['Folder 1', 'Folder 10', 'Folder 11', 'Folder 12', 'Folder 13', 'Folder 14', 'Folder 15', 'Folder 16', 'Folder 17', 'Folder 18', 'Folder 19', 'Folder 2', 'Folder 20', 'Folder 21', 'Folder 22', 'Folder 23', 'Folder 24', 'Folder 25', 'Folder 26', 'Folder 27', 'Folder 28', 'Folder 29', 'Folder 3', 'Folder 30', 'Folder 4', 'Folder 5', 'Folder 6', 'Folder 7', 'Folder 8', 'Folder 9']; directory_contents.sort(key=lambda x: int(x.strip('Folder')))""", number=1000)
0.06238140000000669
timeit("""directory_contents = ['Folder 1', 'Folder 10', 'Folder 11', 'Folder 12', 'Folder 13', 'Folder 14', 'Folder 15', 'Folder 16', 'Folder 17', 'Folder 18', 'Folder 19', 'Folder 2', 'Folder 20', 'Folder 21', 'Folder 22', 'Folder 23', 'Folder 24', 'Folder 25', 'Folder 26', 'Folder 27', 'Folder 28', 'Folder 29', 'Folder 3', 'Folder 30', 'Folder 4', 'Folder 5', 'Folder 6', 'Folder 7', 'Folder 8', 'Folder 9']; directory_contents.sort(key=lambda x:int(x.split(' ')[1]))""", number=1000)
0.08448790000001338
 

Ответ №2:

Просто используйте sort() метод и передайте key ему параметр:-

 directory_contents.sort(key=lambda x:int(x.split(' ')[1]))
 

Теперь, если вы напечатаете directory_contents , вы получите желаемый результат