2016-08-24 12 views
6

Jak sortować tę listę za pomocą wartości numerycznych? Czy wymagane jest wyrażenie regularne do usunięcia liczb lub czy istnieje bardziej Pythoniczny sposób na zrobienie tego?Sortuj listę mieszanych ciągów na podstawie cyfr

to_sort 

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

sygnał wyjściowy jest następujący:

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

dla mnie najbardziej „pythonowy” sposobem jest najwyraźniejszy jeden. Nie zawsze staraj się wszystko w stylu Pythona, ale skup się bardziej na czytelności i dobrych praktykach. – Maroun

+0

@idjaw Próbowałem 'posortowane' z' kluczem', ale poniższe odpowiedzi pomogły mi to lepiej zrozumieć. – ade1e

+0

@adele Zawsze wysyłaj swoje próby, zawsze uczymy się od siebie nawzajem błędów. Niewłaściwe próby są niezwykle pomocne. – Maroun

Odpowiedz

10

Jednym z rozwiązań jest poniższe wyrażenie Ekstrakcja

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 jest wyekstrahowany cyfrowy (w przeliczeniu na int, aby uniknąć sortowania leksograficznego).

4

Jeśli nie chcesz używać regex

>>> 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

Jeśli dane wejściowe są długie, uruchom obie implementacje i zobacz, który z nich jest szybszy. 'filter (std.isdigit, x)' tworzy długą (na znak) tymczasową listę, która może być wolna. – pts

+0

Prawda, filtr jest prawdopodobnie nawet wolniejszy niż genexp. –

+0

Wyznaczyłem odpowiedź, ponieważ pomaga to w zrozumieniu i jest interesujące zobaczyć, jak użyłeś 'isdigit'. dzięki – ade1e

Powiązane problemy