2010-07-09 44 views
37

Làm cách nào để sắp xếp danh sách theo khóa được mô tả bằng chức năng tùy ý? Ví dụ: nếu tôi có:Sắp xếp theo lambda tùy ý

mylist = [["quux", 1, "a"], ["bar", 0, "b"]] 

Tôi muốn sắp xếp "danh sách của tôi" theo yếu tố thứ hai của mỗi thành viên, ví dụ:

sort(mylist, key=lambda x: x[1]) 

Tôi làm cách nào để thực hiện việc này?

+0

Sự cố khi bạn thử mã bạn cung cấp là gì? – tzot

Trả lời

37

Bạn về cơ bản có nó đã:

>>> mylist = [["quux", 1, "a"], ["bar", 0, "b"]] 
>>> mylist.sort(key=lambda x: x[1]) 
>>> print mylist 

cung cấp:

[['bar', 0, 'b'], ['quux', 1, 'a']] 

Điều đó sẽ sắp xếp danh sách của tôi tại chỗ.

[chỉnh sửa này nhờ chỉnh sửa @ Daniel.] sorted sẽ trả về danh sách mới được sắp xếp thay vì thực sự thay đổi đầu vào, như được mô tả trong http://wiki.python.org/moin/HowTo/Sorting/.

+0

Tốt để biết sự khác biệt, cảm ơn. – user248237dfsf

4

Câu trả lời là để sử dụng "sắp xếp", tức là

sorted(mylist, key=lambda x: x[1]) 
+0

Tôi đã có các tham số ngược. Dường như không phù hợp, ví dụ: map/filter/reduce lấy tham số đầu tiên lambda và liệt kê tham số thứ hai nhưng sắp xếp ngược lại. – javadba

7

Bạn có hai lựa chọn, rất gần với những gì bạn mô tả, trên thực tế:

mylist.sort(key=lambda x: x[1]) # In place sort 
new_list = sorted(mylist, key=lambda x: x[1]) 
9

Đây là một nhu cầu như vậy phổ biến mà hỗ trợ cho nó đã được thêm vào thư viện chuẩn, theo hình thức operator.itemgetter:

from operator import itemgetter 
mylist = [["quux", 1, "a"], ["bar", 0, "b"]] 
mylist.sort(key=itemgetter(1)) # or sorted(mylist, key=...) 
4

Sắp xếp và itemgetter là nhanh nhất.

>>> import operator 
>>> import timeit 

>>> mylist = [["quux", 1, "a"], ["bar", 0, "b"]] 
>>> t1 = timeit.Timer(lambda: mylist.sort(key=lambda x: x[1])) 
>>> t1.timeit() 
1.6330803055632404 

>>> t2 = timeit.Timer(lambda: mylist.sort(key=operator.itemgetter(1))) 
>>> t2.timeit() 
1.3985503043467773 

>>> t3 = timeit.Timer(lambda: sorted(mylist, key=operator.itemgetter(1))) 
>>> t3.timeit() 
2.6329514733833292 

>>> t4 = timeit.Timer(lambda: sorted(mylist, key=lambda x: x[1])) 
>>> t4.timeit() 
2.9197154810598533 
Các vấn đề liên quan