2013-02-28 9 views
5

Mam listę list my_list np.Lista sortowania w języku Python na wielu poziomach i z zamówieniem niestandardowym

[ 
['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'], 
['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'], 
['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'], 
['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5'] 
] 

Chcę zamówić tę listę na wielu poziomach z 1 poziomów jest zlecenie klienta, ale nie wiem jak to zrobić.

np. Chcę zamówić najpierw przez pierwszą pozycję, a następnie w kolejności, zamówić je przez trzecią pozycję, a następnie w tej kolejności, zamówienie przez czwartą pozycję. Ale chcę pierwsza pozycja należy zamawiać/klasyfikowane w tym konkretnym celu, a nie w kolejności alfabetycznej:

item 4.1 
item 2.1 
item 3.1 
item 1.1 

więc ostateczną listę (po sortowaniu) byłoby:

[ 
['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'] 
['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'], 
['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5'], 
] 

wiem, że mogę rozwiązać w ciągu wiele poziomów wykonując:

s = sorted(my_list, key=itemgetter(0,2,3)) 

Ale to byłoby posortować je alfabetycznie i wszystko, co nie wiem jak to zrobić znajduje się w pierwszej kolumnie mają być sortowane według kolejności niestandardowej.

+0

Co to jest źródło tej określonej pozycji? Czy to lista przedmiotów? Czy to odwzorowanie? –

+0

Co powiesz na 'key = map (d .__ getitem__, itemgetter (0,2,3) (my_list))' gdzie 'd = {4.1: 0, 2.1: 1, 3.1: 2, 1.1: 3}'? Będąc tak pozbawionym snu, jak ja, nie chcę robić mojego trzeciego błędu na SO na dzień, ale jeśli ktoś może zobaczyć sposób na użycie tego, proszę zrób – inspectorG4dget

+0

Lista pochodzi z zapytania db i jest Lista rzeczy. Wracają w kolejności, w jakiej zostały dodane do db – John

Odpowiedz

4

brzydki i nieefektywne, ale prawdopodobnie działa:

order = ['item 4.1', 'item 2.1', 'item 3.1', 'item 1.1'] 
my_list.sort(key=lambda x: order.index(x[0])) 

zmienia kolejność my_list do:

[['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'], 
['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'], 
['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'], 
['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5']] 

Jeśli chcesz, aby posortować według pierwszej kolumny w spersonalizowanej sposób, a następnie przez trzeci i czwarty alfabetycznie , po prostu rozwiń węzeł: key: który zwraca

[['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'], 
['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'], 
['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5']] 
+0

Dziękuję za to, ale nie wydaje się, że to zrobiło wewnętrzne zamówienia, ponieważ kolejność elementu 3.1 nie jest następnie sortowane według indeksu 3 i 4 – John

+0

Po prostu widziałem edycję dzięki – John

Powiązane problemy