hottabxp
@hottabxp
Сначала мы жили бедно, а потом нас обокрали..

Как в Python отсортировать список по возрастанию?

Получаю список файлов из папки:
files = os.listdir('html')
for x in files:
    print(x)

Вывод такой:
80
43
53
120
157
66
136
168
87
92

Когда к списку применяю метод sort(), то он сортирует не так как надо мне:
После sort()

0
1
10
100
101
102
103
104
105
106
107
108
109
11
110
111
112
113
114
115
116
117
118
119
12
120
121
122
123
124
125
126
127
128
129
13
130
131
132
133
134
135
136
137
138
139
14
140
141
142
143
144
145
146
147
148
149
15
150
151
152
153
154
155
156
157
158
159
16
160
161
162
163
164
165
166
167
168
169
17
170
171
172
173
174
175
176
177
178
179
18
180
181
182
183
184
185
186
187
188
189
19
190
191
192
193
194
195
196
197
198
199
2
20
21
22
23
24
25
26
27
28
29
3
30
31
32
33
34
35
36
37
38
39
4
40
41
42
43
44
45
46
47
48
49
5
50
51
52
53
54
55
56
57
58
59
6
60
61
62
63
64
65
66
67
68
69
7
70
71
72
73
74
75
76
77
78
79
8
80
81
82
83
84
85
86
87
88
89
9
90
91
92
93
94
95
96
97
98
99

Но мне нужно, чтобы числа шли по порядку. Гугл что-то не помог. Уверен что решение простое. Спасибо!
  • Вопрос задан
  • 434 просмотра
Решения вопроса 1
@Maximxls
list.sort(key=int)
Тут функция sort предварительно преобразует элементы в int
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Для конкретно вашего случая Maximxls привёл приемлемое решение.
Я с похожей задачей сталкивался, когда делал CLI утилиту формирования плейлистов для аудиокниг.
Там нужно было правильно отсортировать файлы с главами книги, при этом файлы пронумерованы, содержат текст, размещены в подкаталогах (тоже пронумерованных и с текстом).

Имя каждого файла парсилось (разделялось) на составные части, и формировался ключ для сортировки вот такой вот функцией:
def filename_key(fn: Path, root: Path = None) -> typing.Hashable:
    def split(s: str, re_splitter=re.compile(r'(\D+|\d+)')) -> tuple:
        return tuple(int(chunk) if chunk.isdigit() else chunk for chunk in re_splitter.split(s) if chunk)

    rel_path = fn.relative_to(root) if root else fn
    return tuple(split(name) for name in rel_path.parent.parts) + (split(rel_path.stem) + (rel_path.suffix,),)

Можно применять так:
my_files = (f for f in my_folder_path.rglob('*.mp3'))
my_sorted_files = sorted((
    (filename_key(f, root=my_folder_path), f) 
    for f in my_files
))
Ответ написан
Ваш ответ на вопрос

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

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