2013-01-08 45 views
10

tôi có một danh sáchSắp xếp một danh sách với một trật tự tùy chỉnh bằng Python

mylist = [['123', 'BOOL', '234'], ['345', 'INT', '456'], ['567', 'DINT', '678']]

Tôi muốn sắp xếp nó với thứ tự của 1. DINT 2. INT 3. BOOL

Kết quả:

[['567', 'DINT', '678'], ['345', 'INT', '456'], ['123', 'BOOL', '234']]

Tôi đã nhìn thấy các câu hỏi tương tự khác trong stackove rflow nhưng không có gì tương tự hoặc dễ dàng áp dụng cho tôi.

+0

bạn có một lỗi cú pháp: '345 không được đóng lại. –

+0

"Tôi muốn sắp xếp nó theo thứ tự 1. DINT 2. INT 3. BOOL". Thứ tự đó là gì? Nếu tôi thêm một mục khác '[' 317.3 ',' FLOAT ',' 268.0 '] ', làm thế nào để tôi biết nó ở đâu trong đầu ra được sắp xếp? –

+0

@KarlKnechtel Vâng, ứng dụng hoàn chỉnh này là sắp xếp REAL (float), DINT, INT, SINT, BOOL. Đây là thứ tự tôi muốn (lớn đến nhỏ). Câu hỏi này ở đây chỉ nhằm mục đích minh họa. '123', '234', '345' ... tất cả đều không có ý nghĩa thực sự. – elwc

Trả lời

26
SORT_ORDER = {"DINT": 0, "INT": 1, "BOOL": 2} 

mylist.sort(key=lambda val: SORT_ORDER[val[1]]) 

Tất cả những gì chúng tôi đang làm ở đây là cung cấp phần tử mới để sắp xếp bằng cách trả về một số nguyên cho mỗi phần tử trong danh sách chứ không phải toàn bộ danh sách. Chúng tôi có thể sử dụng các biểu thức ternary nội tuyến, nhưng điều đó sẽ hơi khó sử dụng.

+0

Xin lỗi tôi sẽ chỉnh sửa câu hỏi – elwc

+0

Tôi không biết mình đang thiếu gì nhưng tôi gặp lỗi cú pháp – elwc

+0

@elwc - loại lỗi nào? –

0

Vì điều đó không theo thứ tự bảng chữ cái tôi không nghĩ rằng có một chức năng duy nhất có thể sắp xếp nó nhưng những gì bạn có thể làm là tạo danh sách mới và sau đó nối thêm. Đây là một phương pháp rẻ tiền để làm điều đó; nhưng nó hoàn thành công việc.

newlist=[]; 
for sub_list in mylist: 
    if(sub_list[1] == 'DINT']): 
      newlist.append(sub_list); 

for sub_list in mylist: 
    if(sub_list[1] == 'INT']): 
     newlist.append(sub_list); 

for sub_list in mylist: 
    if(sub_list[1] == 'BOOL']): 
      newlist.append(sub_list); 
+0

Niềng răng? 'từ __future__ nhập khẩu niềng răng' ;-) Ngoài ra, xem câu trả lời của tôi - bạn chỉ cần đi qua danh sách một lần :-) –

+0

Vâng tôi thích câu trả lời khác. Giải pháp hai lớp lót. – elwc

+1

Ngay cả khi cách tiếp cận này có ý nghĩa, cho tình yêu của tất cả những gì là thánh, sử dụng danh sách comprehensions, hoặc 'lọc', hoặc một cái gì đó. –

-1
 python 3.2 

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

    2. sorted(mylist,reverse=True) 
Các vấn đề liên quan