2013-09-01 38 views
6

Tôi đã theo danh sáchSorting 2D loại danh sách python

[1, 0.23] 
[2, 0.39] 
[4, 0.31] 
[5, 0.27] 

Tôi muốn sắp xếp này theo thứ tự cột thứ hai giảm dần. Tôi đã thử chức năng 'sắp xếp' trong python. Nhưng cung cấp cho tôi một đối tượng 'TypeError': 'float' không thể ghi đè. Hãy giúp tôi giải quyết vấn đề này.

+1

Tôi xin lỗi, nhưng đó không phải là một danh sách. Đó là một chuỗi các số với các dòng mới, nhưng không phải là bất kỳ cấu trúc Python nào. Vui lòng đăng mã thực tế không thành công cho bạn và đại diện của danh sách. –

+1

Bây giờ chúng ta có một chuỗi các danh sách python; là có một danh sách bên ngoài? –

+0

Rõ ràng không phải ngoài chủ đề, vì đó là kết quả tìm kiếm Google số 1 để sắp xếp danh sách 2D bằng Python và câu trả lời hay nhất có 15 phiếu bầu. – JeffThompson

Trả lời

11

Để sắp xếp một danh sách liệt kê vào cột thứ hai, sử dụng operator.itemgetter() cho dễ dàng và rõ ràng:

from operator import itemgetter 
outputlist = sorted(inputlist, key=itemgetter(1), reverse=True) 

hay, để sắp xếp tại chỗ:

from operator import itemgetter 
inputlist.sort(key=itemgetter(1), reverse=True) 

itemgetter() là một chút nhanh hơn sử dụng lambda cho tác vụ.

Demo:

>>> from operator import itemgetter 
>>> inputlist = [ 
...  [1, 0.23], 
...  [2, 0.39], 
...  [4, 0.31], 
...  [5, 0.27], 
... ] 
>>> sorted(inputlist, key=itemgetter(1), reverse=True) 
[[2, 0.39], [4, 0.31], [5, 0.27], [1, 0.23]] 

Bạn chỉ muốn nhìn thấy ngoại trừ của bạn nếu bạn đã điểm nổi giá trị trong inputlist của bạn trực tiếp:

>>> inputlist.append(4.2) 
>>> inputlist 
[[1, 0.23], [2, 0.39], [4, 0.31], [5, 0.27], 4.2] 
>>> sorted(inputlist, key=itemgetter(1), reverse=True) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'float' object is not subscriptable 

(cho Python 3; thông báo lỗi Python 2 là hơi khác, dẫn đến thay vào đó là TypeError: 'float' object has no attribute '__getitem__').

Điều này là do cuộc gọi itergetter(1) được áp dụng cho tất cả các phần tử trong danh sách bên ngoài nhưng chỉ hoạt động trên chuỗi được sắp xếp theo thứ tự, chứ không phải trên một giá trị dấu chấm động hiện được thêm.

+0

Tôi đã thử điều này, nhưng kể từ cột thứ hai của tôi là nổi nó mang lại cho tôi 'TypeError': 'float' đối tượng là unsubscriptable –

+1

@ChinthakaNadunRatnaweera: Không, sau đó danh sách của bạn không được lồng nhau. Bạn có các giá trị float * trực tiếp * được tham chiếu trong danh sách ngoài của bạn. In danh sách của bạn và sao chép nó vào câu hỏi của bạn. –

18

Bạn có thể sử dụng một lambda:

>>> li=[[1, 0.23], 
... [2, 0.39], 
... [4, 0.31], 
... [5, 0.27]] 
>>> sorted(li,key=lambda l:l[1], reverse=True) 
[[2, 0.39], [4, 0.31], [5, 0.27], [1, 0.23]] 

Hoặc cách khác:

>>> sorted(li,key=lambda l:l[1]) 
[[1, 0.23], [5, 0.27], [4, 0.31], [2, 0.39]] 
Các vấn đề liên quan