2016-04-09 36 views
5

Tôi muốn sắp xếp một danh sách bằng Python dựa trên một danh sách presortedSắp xếp một danh sách trong python dựa trên một danh sách được sắp xếp

presorted_list = ['2C','3C','4C','2D','3D','4D'] 
unsorted_list = ['3D','2C','4D','2D'] 

Có cách nào để sắp xếp danh sách để phản ánh danh sách presorted mặc dù thực tế là không phải tất cả các phần tử đều có mặt trong danh sách chưa được phân loại?

tôi muốn kết quả tìm kiếm một cái gì đó như thế này:

after_sort = ['2C','2D','3D','4D'] 

Cảm ơn!

Trả lời

7
In [5]: sorted(unsorted_list, key=presorted_list.index) 
Out[5]: ['2C', '2D', '3D', '4D'] 

hay, cho hiệu suất tốt hơn (đặc biệt là khi len(presorted_list) là lớn),

In [6]: order = {item:i for i, item in enumerate(presorted_list)}  
In [7]: sorted(unsorted_list, key=order.__getitem__) 
Out[7]: ['2C', '2D', '3D', '4D'] 

Để biết thêm về cách sắp xếp sử dụng key s, xem tuyệt vời Howto Sort wiki.


Nếu unsorted_list chứa mặt hàng (ví dụ như '6D') không presorted_list sau đó các phương pháp trên sẽ nâng cao một lỗi. Trước tiên, bạn phải quyết định cách bạn muốn sắp xếp các mục này. Nếu bạn muốn họ đặt ở cuối danh sách, bạn có thể sử dụng

In [10]: unsorted_list = ['3D','2C','6D','4D','2D'] 

In [11]: sorted(unsorted_list, key=lambda x: order.get(x, float('inf'))) 
Out[11]: ['2C', '2D', '3D', '4D', '6D'] 

hoặc nếu bạn muốn đặt các hạng mục như ở phía trước của danh sách, sử dụng

In [12]: sorted(unsorted_list, key=lambda x: order.get(x, -1)) 
Out[12]: ['6D', '2C', '2D', '3D', '4D'] 
+0

Tôi xin lỗi, tôi 'm mới này, nhưng bit đầu tiên của mã dường như cung cấp cho tôi một lỗi giá trị cho mục đầu tiên trong danh sách chưa được phân loại. Giá trị lỗi: '6D' không có trong danh sách –

+0

'.index' sẽ tăng lỗi giá trị nếu mục không nằm trong danh sách presorted_list. –

+0

@ Danica: Nếu bạn muốn các mục _removed_ không có trong 'presorted_list', hãy sử dụng một cái gì đó như' được sắp xếp (itertools.ifilter (lambda x: x trong presorted_list, unsorted_list), key = order .__ getitem __) '. – martineau

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