2013-08-02 46 views
9

tôi có một danh sách được xác định trước đó cho thấy thứ tự của một số giá trị:python danh sách loại dựa trên chủ chốt sắp xếp danh sách

['id','name','age','height','weight',] 

(có thể rất dài)

Tôi muốn sắp xếp bất kỳ tập hợp con của danh sách này :

Vì vậy, nếu tôi nhận được ['height','id'] Nó sẽ trở thành ['id','height']

hoặc ['name','weight','height'] --->['name','height','weight']

Có cách nào để thực hiện điều đó với chức năng sort bằng cách sử dụng tham số key bằng cách nào đó không? hoặc tôi nên sử dụng một phương pháp tùy chỉnh, nếu có thì điều gì sẽ hiệu quả nhất?

Trả lời

16

Cách hiệu quả nhất là tạo ra một bản đồ từ từ để đặt hàng:

ordering = {word: i for i, word in enumerate(predefined_list)} 

sau đó sử dụng bản đồ mà trong phân loại:

somelist.sort(key=ordering.get) 

Cách khác là sử dụng .index() trên danh sách công việc quét qua danh sách và tìm chỉ mục cho từng từ trong khi sắp xếp:

somelist.sort(key=predefined_list.index) 

nhưng đây không phải là gần hiệu quả bằng cách sử dụng từ điển ordering.

Demo:

>>> predefined_list = ['id','name','age','height','weight',] 
>>> ordering = {word: i for i, word in enumerate(predefined_list)} 
>>> sorted(['height','id'], key=ordering.get) 
['id', 'height'] 
>>> sorted(['name','weight','height'], key=ordering.get) 
['name', 'height', 'weight'] 

Hai phương pháp sẽ cho kết quả trong đơn đặt hàng sắp xếp khác nhau nếu bất kỳ giá trị trong danh sách được xác định trước là không duy nhất. Phương pháp .index() sử dụng lần xuất hiện đầu tiên của một giá trị làm giá trị sắp xếp, phương pháp từ điển sẽ sử dụng giá trị cuối cùng thay thế. Có nhiều cách xung quanh, bạn có thể làm cho phương pháp từ điển xử lý danh sách và các chỉ mục ngược lại chẳng hạn.

4

Các giải pháp ngắn nhất:

lst = ['id', 'name', 'age', 'height', 'weight',] 
test = ['name', 'weight', 'height'] 

print [word for word in lst if word in test] 

Returns:

['name', 'height', 'weight'] 

Điều này cho thấy tất cả các mục từ lst theo thứ tự mà chỉ khi mục được chứa trong thử nghiệm. Ưu điểm: không cần phân loại.

Sau khi nhận xét:

Nhược điểm: - Bản sao có thể không được hiển thị - Các 'trong' nhà điều hành được nghĩa một traversal; giống như cái thứ hai. Vì vậy, nếu danh sách dài thì nó có thể không hiệu quả. Tuy nhiên, giải pháp từ Martijn cũng có hai loại vì vậy tôi không thể quyết định dễ dàng hiệu quả hơn.

+0

Đây là những gì tôi đã nghĩ đến, bạn có thể cho biết liệu nó có hiệu quả như giải pháp của @Martijn không? – YardenST

+0

nhược điểm - lst có thể rất dài và bạn phải đi qua tất cả ngay cả đối với danh sách nhỏ, nó cũng sẽ không hiển thị chính xác bản sao –

+1

tùy thuộc vào độ dài của danh sách được xác định trước.yêu cầu của tôi là xem xét nó rất lớn và sử dụng chức năng sắp xếp, do đó tôi đã đánh dấu câu trả lời của anh ấy là giải pháp. Cảm ơn câu trả lời của bạn, nó cũng tuyệt vời. – YardenST

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