Сортировать список строк Python по числовому номеру

У меня есть список имен файлов с именем filelist

 In []: filelist
Out []: ['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx',
         'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx',
         'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx']

Я хочу отсортировать этот список файлов по числовому значению, которое находится в жирном шрифте

C: \ Mon20412 \ P-2NODE-RAID6- 1 BLACK-32k-100-segmented.xlsx
C: \ Mon25312 \ P-2NODE-RAID6- 13 RED-32k-100-segmented.xlsx
C: \ Mon20362 \ P-2NODE-RAID6- 2 GREEN-32k-100-segmented.xlsx

Так что в этом примере вывод будет

Out []: ['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx',
         'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx'
         'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx']

Спасибо!

3 ответа

Решение

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

a = ['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx',
    'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx',
    'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx']

def k(a):
    x = a.split("\\")[-1].split("-")[3]
    y = filter(lambda x: x in "0123456789", x)
    return int("".join(list(y)))


print(sorted(a, key=k))

выход:

['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx', 
'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx',
'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx']
import re

f = lambda s: int(re.findall(r'.*RAID6-(\d+).*', s)[0])
sorted(l, key=f)

Используйте регулярные выражения, чтобы разобрать число и использовать его в качестве ключа сортировки.

Быстро и грязно:

import re

l = ['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx',
     'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx',
     'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx']

def get_sort_number(s):
    pattern = r'C:\\Mon\d+\\P-2NODE-RAID6-(\d+)'

    try:
        return int(re.match(pattern, s).group(1))
    except AttributeError:
        return 0

sorted(l, key=get_sort_number)

Это дает

['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx',
 'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx',
 'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx']

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

Другие вопросы по тегам