2015-06-08 2 views
3

У меня есть ряд каталогов, которые все с именем в качестве значения с плавающей точкой, например:Python элегантный способ сортировки числовую названные каталоги

0 
1 
2 
2.5 
6 
6.1 
10 

Я хотел бы получить последний (самый высокий) пронумерованный каталог. Используя метод сортировки() в именах каталогов (которые строка), я получаю 10 непосредственно после 1

dirs = os.listdir(path) 
dirs.sort() 

Это дает приказ:

0 
1 
10 
2 
2.5 
6 
6.1 

я могу поместить их в список поплавков путем кастования каждого поплавка и последующего упорядочения списка, что решает проблему упорядочения. Но тогда, когда я возвращаю значение строки, я получаю 10.0, что не является именем каталога. Мне нужно, чтобы оно было точно «10» (или как бы ни назывался последний каталог).

Есть ли элегантный способ сделать это?

ответ

6

Вы можете использовать ключ аргумент sort:

dirs = os.listdir(path) 
dirs.sort(key=float) 

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

В этом случае мы используем float как вызываемый, который возвращает значение с плавающей запятой, представленное переданными ему строками.

Очевидно, что это взрывается струнами, которые не плавают (ValueError), но это, кажется, вне вашей проблемы.

+5

Если вам не интересно иметь отсортированный список в конце, вы можете просто использовать max встроенный таким же образом; 'max (os.listdir (path), key = float)' - он все равно будет сортировать их в фоновом режиме, но вы можете предпочесть его внешний вид. – LexyStardust

+1

@LexyStardust он не будет сортировать их, он сделает один проход. –

+0

@PeterWood О, да, конечно, вы правы. Можете выходить и быть лучшим решением, если впоследствии вас не интересует отсортированный список. – LexyStardust

Смежные вопросы