2012-10-10 46 views
28

Có một danh sách:Cách sắp xếp danh sách theo danh sách khác?

a = [("ax", 1), ("ec",3), ("bk", 5)] 

danh sách khác:

b = ["ec", "ax", "bk"] 

Tôi muốn sắp xếp một theo b:

sort_it(a, b) 

a = [("ec",3), ("ax", 1), ("bk", 5)] 

Làm thế nào để làm điều này?

+2

có thể trùng lặp của [Danh sách sắp xếp dựa trên giá trị từ danh sách khác?] (Http://stackoverflow.com/questions/6618515/sorting-list-based-on-values-from-another-list) – user1251007

Trả lời

47
a.sort(key=lambda x: b.index(x[0])) 

này phân loại a tại chỗ bằng cách sử dụng các chỉ số trong b của phần tử đầu tiên của mỗi tuple từ a như các giá trị nó loại trên.

khác, có thể sạch hơn, cách viết nó sẽ là:

a.sort(key=lambda (x,y): b.index(x)) 

Nếu bạn có một số lượng lớn các mặt hàng, nó có thể là hiệu quả hơn để làm những việc khác một chút, vì .index() có thể một hoạt động đắt tiền trên một danh sách dài và bạn không thực sự cần phải phân loại đầy đủ vì bạn đã biết thứ tự:

mapping = dict(a) 
a[:] = [(x,mapping[x]) for x in b] 

Lưu ý rằng điều này sẽ chỉ hoạt động đối với danh sách 2 bộ dữ liệu. Nếu bạn muốn nó để làm việc cho các bộ tùy độ dài, bạn cần phải sửa đổi nó một chút:

mapping = dict((x[0], x[1:]) for x in a) 
a[:] = [(x,) + mapping[x] for x in b] 
1

posibility khác là để sắp xếp a, sắp xếp các chỉ số của b theo b và hơn sắp xếp các a theo các chỉ số

a.sort(key=lambda x: x[0]) 
ind = [i[0] for i in sorted(enumerate(b),key=lambda x: x[1])] 
a = [i[0] for i in sorted(zip(a,ind),key=lambda x: x[1])] 

vì mỗi phân loại mất n * log (n) này vẫn còn khả năng mở rộng cho các danh sách lớn hơn

0

phân loại truyền thống có thể không cần thiết.

[tup for lbl in b for tup in a if tup[0] == lbl] 
# [('ec', 3), ('ax', 1), ('bk', 5)] 
Các vấn đề liên quan