2013-01-08 20 views
10

Mam listęSortowanie listy z niestandardowej kolejności w Pythonie

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

chcę sortować je z rzędu 1. DINT 2. INT 3. BOOL

Wynik:

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

Widziałem inne podobne pytania w stackove rflow ale nic podobnego lub łatwego do zastosowania dla mnie.

+0

masz błąd składni: „345 nie jest zamknięty. –

+0

"Chcę posortować go w kolejności 1. DINT 2. INT 3. BOOL". Jaka jest kolejność? Jeśli dodaję kolejny element '['317.3', 'FLOAT', '268.0']', skąd mam wiedzieć, gdzie idzie posortowane wyjście? –

+0

@KarlKnechtel Cóż, kompletnym zastosowaniem tego jest sortowanie REAL (float), DINT, INT, SINT, BOOL. To jest kolejność, której chcę (od małej do dużej). To pytanie jest tylko w celach ilustracyjnych. "123", "234", "345" ... wszystko nie ma prawdziwego znaczenia. – elwc

Odpowiedz

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

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

Wszystko, co tutaj robimy, to dostarczanie nowego elementu do sortowania przez zwracanie liczby całkowitej dla każdego elementu na liście, a nie całej listy. Możemy używać używać wbudowanych potrójnych wyrażeń, ale to byłoby trochę nieporęczne.

+0

Przepraszam, będę edytować pytanie – elwc

+0

Nie wiem, czego mi brakuje, ale dostaję błąd składniowy – elwc

+0

@elwc - jakie błędy? –

0

Ponieważ nie jest to w porządku alfabetycznym, nie sądzę, że istnieje jedna funkcja, która może ją sortować, ale można utworzyć nową listę, a następnie dołączyć. Jest to rodzaj taniej metody robienia tego; ale wykonuje to zadanie.

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

Szelki? 'from __future__ importuj nawiasy klamrowe' ;-) Zobacz także moją odpowiedź - wystarczy przejrzeć listę tylko raz :-) –

+0

Tak, wolę inną odpowiedź. Rozwiązanie dwóch linerów. – elwc

+1

Nawet jeśli to podejście miało sens, z miłości do wszystkiego, co święte, użyj zrozumienia list, lub "filtru", lub czegoś takiego. –

-1
 python 3.2 

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

    2. sorted(mylist,reverse=True) 
Powiązane problemy