2016-08-24 5 views
6

Как отсортировать список по цифровым значениям? Является ли регулярное выражение необходимым для удаления чисел или существует ли более Pythonic способ сделать это?Сортировка списка смешанных строк на основе цифр

to_sort 

['12-foo', 
'1-bar', 
'2-bar', 
'foo-11', 
'bar-3', 
'foo-4', 
'foobar-5', 
'6-foo', 
'7-bar'] 

Желаемый выход следующим образом:

1-bar 
2-bar 
bar-3 
foo-4 
foobar-5 
6-foo 
7-bar 
foo-11 
12-foo 
+1

Для меня самый «Pythonic» путь является ярким один. Не всегда старайтесь все на Python-way, но больше ориентируйтесь на читаемость и хорошие практики. – Maroun

+0

@idjaw Я попробовал 'sorted' с' key', но ответы ниже помогли мне понять это лучше. – ade1e

+0

@adele Всегда отправляйте свои попытки, мы всегда учимся на ошибках друг друга. Неправильные попытки чрезвычайно полезны. – Maroun

ответ

10

Одно из решений состоит в следующем регулярное выражение экстракции:

sorted(l, key=lambda x: int(re.search('\d+', x).group(0))) 

>>> l 
['12-foo', '1-bar', '2-bar', 'foo-11', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar'] 
>>> sorted(l, key=lambda x: int(re.search('\d+', x).group(0))) 
['1-bar', '2-bar', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar', 'foo-11', '12-foo'] 

key является извлеченный цифра (преобразуется в int, чтобы избежать сортировки по лексике).

4

Если вы не хотите использовать регулярное выражение

>>> l = ['12-foo', '1-bar', '2-bar', 'foo-11', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar'] 

>>> sorted(l, key = lambda x: int(''.join(filter(str.isdigit, x)))) 

['1-bar', '2-bar', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar', 'foo-11', '12-foo'] 
+2

Если вход длинный, запустите обе реализации и посмотрите, какая из них быстрее. 'filter (std.isdigit, x)' создает длинный (для символа) временный список, который может быть медленным. – pts

+0

Правда, фильтр, вероятно, даже медленнее, чем ген xp для этого. –

+0

Я отметил ответ, так как это помогает мне понять, и интересно посмотреть, как вы использовали 'isdigit'. благодаря – ade1e

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