Сортировать список строк 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']
Все строки, которые не могут быть сопоставлены с регулярным выражением, будут в начале отсортированного списка.