2016-01-26 3 views
4

В настоящее время я пытаюсь сортировать список файлов, которые были сделаны из номеров версий. Например:Список сортировки с несколькими критериями в python

0.0.0.0.py 
1.0.0.0.py 
1.1.0.0.py 

Все они хранятся в списке. Моя идея состояла в том, чтобы использовать метод sort списка в сочетании с выражением лямбда. Лямбда-выражение должно сначала удалить расширения .py, а затем разбить строку на точки. Чем отличает каждое число до целого числа и сортирует по ним.

Я знаю, как бы это сделать в C#, но я понятия не имею, как это сделать с помощью python. Одна из проблем заключается в том, как я могу сортировать по нескольким критериям? И как включить это лямбда-выражение?

Может ли кто-нибудь мне помочь?

спасибо!

ответ

5

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

filenames = [ 
    '1.0.0.0.py', 
    '0.0.0.0.py', 
    '1.1.0.0.py' 
] 

print sorted(filenames, key=lambda f: map(int, f.split('.')[:-1])) 

Результат:

['0.0.0.0.py', '1.0.0.0.py', '1.1.0.0.py'] 

Лямбда разбивает имя файла на части, удаляет последнюю часть и преобразует оставшиеся, в целых числах. Тогда sorted использует это значение в качестве критерия сортировки.

+0

Кажется, это лучшее решение. Большое спасибо! – BendEg

3

Имейте функцию key, чтобы вернуть список элементов. В этом случае сортировка является лексикографической.

l = [ '1.0.0.0.py', '0.0.0.0.py', '1.1.0.0.py',] 
s = sorted(l, key = lambda x: [int(y) for y in x.replace('.py','').split('.')]) 
print s 
+0

Спасибо, я попробую! – BendEg

2
# read list in from memory and store as variable file_list 
sorted(file_list, key = lambda x: map(int, x.split('.')[:-1])) 

В случае, если вам интересно, что происходит здесь:

Наша функция лямбда-первых принимает наше имя файла, разбивает его в массив, ограниченный период. Затем мы берем все элементы списка, минус последний элемент, который является нашим расширением. Затем мы применяем функцию «int» к каждому элементу списка. Возвращаемый список затем сортируется по функции «сортировка» в соответствии с элементами списка, начиная с первых, с привязанными к ним элементами в списке.

+0

'[: -1]' выполняет все расширения файлов, а не только '.py'. И используя 'map' с' int' на split. +1 для тех. – aneroid

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