>>> from operator import itemgetter
>>> data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
>>> sorted(data,key=itemgetter(1))
[('abc', 121), ('abc', 148), ('abc', 221), ('abc', 231)]
IMO sử dụng itemgetter
dễ đọc hơn trong trường hợp này so với giải pháp của @cheeken. Nó là cũng nhanh hơn vì hầu như tất cả các tính toán sẽ được thực hiện ở bên c
(không có ý định chơi chữ) thay vì thông qua việc sử dụng lambda
.
>python -m timeit -s "from operator import itemgetter; data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=itemgetter(1))"
1000000 loops, best of 3: 1.22 usec per loop
>python -m timeit -s "data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=lambda x: x[1])"
1000000 loops, best of 3: 1.4 usec per loop
+1 Tôi đồng ý rằng 'itemgetter()' là một giải pháp tốt hơn.Tuy nhiên, tôi nghĩ rằng một biểu thức lambda sẽ làm cho nó rõ ràng hơn như thế nào 'phím' chức năng. – cheeken
+1 Tuy nhiên, khi tôi chạy thử nghiệm của bạn về tốc độ tôi nhận thấy 'mắt người' mà một trong những nghĩa vụ phải nhanh hơn .. và đo nhanh hơn, thực sự là đáng chú ý chậm hơn. Tôi gãi đầu của tôi về điều này cho một chút, sau đó lấy các mô-đun thời gian chờ python ra chơi và chỉ sử dụng thời gian linux. tức là 'time \' python -c "mã" \ '' sau đó tôi nhận được kết quả 'mắt người' mà bạn đánh vần, cũng như thời gian của đồng hồ sys nhanh hơn. Vẫn không chắc chắn lý do tại sao điều này là, nhưng nó đã được tái sản xuất. Tôi thu thập nó có một cái gì đó để làm với các chi phí tải trong các mô-đun, nhưng vẫn không hoàn toàn làm cho kể từ với tôi, chỉ được nêu ra. –
@JeffSheffield: Lưu ý rằng jamylak đang thực hiện nhập mã cài đặt (ngoài thời gian), không phải mã được thử nghiệm. Điều đó hoàn toàn hợp lý, bởi vì hầu hết các chương trình sẽ cần sắp xếp nhiều hơn một lần, hoặc cần sắp xếp các bộ sưu tập lớn hơn nhiều, nhưng chúng sẽ chỉ thực hiện nhập một lần. (Và đối với những chương trình mà chỉ cần làm một loại nhỏ từng có ... tốt, bạn đang nói về một sự khác biệt dưới một micro giây, vì vậy những người quan tâm một trong hai cách?) – abarnert