2013-07-09 24 views
55

Tôi muốn sắp xếp danh sách các danh sách sau theo phần tử thứ tư (số nguyên) trong mỗi danh sách riêng lẻ.Python - Cách sắp xếp danh sách các danh sách theo phần tử thứ tư trong mỗi danh sách?

unsorted_list = [['a','b','c','5','d'],['e','f','g','3','h'],['i','j','k','4','m']] 

Tôi làm cách nào để thực hiện việc này? Cảm ơn bạn!

+0

Bạn có muốn để sắp xếp theo yếu tố thứ hai hay thứ tư? – Taymon

Trả lời

95
unsorted_list.sort(key=lambda x: x[3]) 
+42

Điều đáng chú ý là trong phương pháp này, các số nguyên được so sánh theo từ điển. Do đó, '' 5'' sẽ lớn hơn ''20''. Nếu cần so sánh số nguyên, bạn nên sử dụng 'key = lambda x: int (x [3])' – inspectorG4dget

+10

Bạn cũng có thể sử dụng 'key = itemgetter (3)' tại đây (từ ['operator'] (http) : //docs.python.org/3.3/library/operator.html#operator.itemgetter) mô-đun). Trong khi một số người tìm thấy 'itemgetter' và' attrgetter' ít có thể đọc được hơn lambdas, những người khác sử dụng chúng rộng rãi, vì vậy ít nhất đáng để đọc chúng và biết họ làm gì. – abarnert

+0

đây là lý do tại sao tôi yêu python <3 –

27

Sử dụng sorted() với một key như sau -

>>> unsorted_list = [['a','b','c','5','d'],['e','f','g','3','h'],['i','j','k','4','m']] 
>>> sorted(unsorted_list, key = lambda x: int(x[3])) 
[['e', 'f', 'g', '3', 'h'], ['i', 'j', 'k', '4', 'm'], ['a', 'b', 'c', '5', 'd']] 

Các lambda lợi nhuận là yếu tố thứ tư của mỗi danh sách bên trong và sorted chức năng sử dụng mà để sắp xếp những danh sách. Điều này giả định rằng int(elem) sẽ không thất bại trong danh sách.

Hoặc sử dụng itemgetter (Theo bình luận Ashwini của chỉ ra, phương pháp này sẽ không hoạt động nếu bạn có cơ quan đại diện chuỗi các con số, kể từ khi họ đang bị ràng buộc để thất bại ở đâu đó cho số 2+ chữ số)

>>> from operator import itemgetter 
>>> sorted(unsorted_list, key = itemgetter(3)) 
[['e', 'f', 'g', '3', 'h'], ['i', 'j', 'k', '4', 'm'], ['a', 'b', 'c', '5', 'd']] 
+1

'itemgetter' sẽ không hoạt động nếu danh sách chứa:' [['a', 'b', 'c', '100', 'd'], ['e', 'f', 'g', ' 2 ',' h '], [' i ',' j ',' k ',' 4 ',' m ']] ' –

+0

Đúng. Có lẽ tôi chỉ cần loại bỏ nó, 'lambda' làm thủ thuật ở đây. –

+0

Có, 'itemgetter (3)' chỉ thay thế 'lambda x: x [3]', không phải 'lambda x: int (x [3])'. (Bạn có thể 'soạn (int, itemgetter (3))', nhưng chỉ nếu bạn điên, hoặc thực sự quyết tâm viết mã Haskell hoặc Lisp bằng Python ...) – abarnert