2016-08-24 15 views
6

Làm cách nào để sắp xếp danh sách này thông qua các giá trị số? Là một regex cần thiết để loại bỏ các con số hoặc là có một cách Pythonic hơn để làm điều này?Sắp xếp danh sách các chuỗi hỗn hợp dựa trên các số

to_sort 

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

đầu ra mong muốn được như sau:

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

Đối với tôi, "Pythonic" cách mà hầu hết là rõ ràng nhất một. Không phải lúc nào cũng cố gắng để Python mọi cách, nhưng tập trung hơn vào khả năng đọc và thực hành tốt. – Maroun

+0

@idjaw Tôi đã cố gắng 'sắp xếp' với một 'chìa khóa' nhưng câu trả lời dưới đây đã giúp tôi hiểu điều này tốt hơn. – ade1e

+0

@adele Luôn đăng nỗ lực của bạn, chúng tôi luôn học hỏi từ những sai lầm của nhau. Các nỗ lực sai là vô cùng hữu ích. – Maroun

Trả lời

10

Một giải pháp là quá trình chiết regex sau:

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

Các key là chữ số chiết xuất (chuyển đổi sang int để tránh sắp xếp theo từ điển).

4

Nếu bạn không muốn sử dụng 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

Nếu đầu vào dài, hãy chạy cả hai lần triển khai và xem cài đặt nào nhanh hơn. 'bộ lọc (std.isdigit, x)' tạo một danh sách tạm thời dài (cho mỗi ký tự), có thể chậm. – pts

+0

Đúng, bộ lọc có lẽ thậm chí còn chậm hơn một genexp cho điều này. –

+0

Tôi đã đánh dấu câu trả lời vì điều này giúp tôi hiểu và thật thú vị khi xem bạn đã sử dụng 'isdigit' như thế nào. cảm ơn – ade1e

Các vấn đề liên quan