2012-07-20 19 views
5

Mam listę krotek formacie:sortowanie wykresu według jego ciężaru krawędzi. pyton

(node1, node2, weight) 

Co chcę zrobić, to rodzaj to krotka tak, że węzły o większej masie są na górze

np

(A,B,2) 
(A,C,5) 
(C,A,2) 

powinien dać mi

(A,C,5) 
(A,B,2) 
(C,A,2) 

pierwszego węzła jest sortowane alfabetycznie. Drugi węzeł zgodnie ze zmniejszającymi się stopniami masy.

+0

Masz na myśli "krawędź o większej wadze"? Zakładam, że krotka '(węzeł1, węzeł2, waga) reprezentuje krawędź. –

Odpowiedz

9

ten powinien działać dobrze:

lst.sort(key=lambda x:x[2], reverse=True) 

Oczywiście, możemy uniknąć lambda przez:

import operator 
lst.sort(key=operater.itemgetter(2), reverse=True) 

Jeśli chcesz posortować na wielu warunków, można tworzyć ciekawe funkcje, aby powrócić krotki (krotki będą sortować według pierwszego indeksu, potem drugiego, potem trzeciego ...), albo możesz użyć faktu, że rodzaje Pythona mają gwarancję stabilności. Jeśli chcesz, aby twoja lista była sortowana według wagi, a następnie według nazwy węzła, najpierw sortuj według nazwy węzła, a następnie według wagi. (Kolejność wstecz jest trochę sprzeczna z intuicją).

Jeśli rozumiem Twoje pytanie (po re-read i widząc niektóre komentarze tutaj) masz do sortowania może być wykonane w następujący sposób:

lst.sort(key=lambda x: (-x[2],x[0])) #relying on tuples 

ta sortuje głównie wagowych (duża liczba pierwsza) a następnie według węzła1 alfabetycznie dla obiektów o tej samej wadze.

Należy zauważyć, że działa to tylko wtedy, gdy można negować x[2], aby wysokie liczby pojawiły się jako pierwsze w sortowaniu (na przykład nie działałoby dla łańcuchów). Bardziej niezawodny sposób na osiągnięcie tego samego (choć mniej wydajnego?) Będzie:

lst.sort(key=lambda x: x[0]) 
lst.sort(key=lambda x: x[2], reversed=True) 
+0

Nie potrzebujesz mojej zgody ... Twoja odpowiedź jest teraz w pełni kompletna i dokładna. Skasuję mój wcześniejszy komentarz. – steveha

+0

@steveha - Wiem, że nie. Ale chcę, żeby to była dobra odpowiedź. Jeśli mogę to poprawić, zrobię to. Dzięki za opinie. Myślę, że teraz jest lepiej. – mgilson

+0

To jest teraz kompletna odpowiedź.Szczególnie podoba mi się przykład na końcu używania "stabilnego" sortowania z dwoma krokami, aby osiągnąć to samo, gdzie nie możemy po prostu zbudować krotki z jedną zanegowaną wartością. – steveha

5

Użyj "funkcji klawiszy". Ponieważ najpierw chcesz sortować duże ciężary, funkcja klucza powinna zwracać ujemną wartość ciężaru, tak aby większe ciężary były sortowane niżej.

A='A' 
B='B' 
C='C' 
lst = [(A, B, 2), (A, C, 5), (C, A, 2)] 

def weight_key(tup): 
    return tup[0], -tup[2], tup[1] 

lst.sort(key=weight_key) 
print(lst) # prints: [('A', 'C', 5), ('A', 'B', 2), ('C', 'A', 2)] 

EDYCJA: Właśnie ponownie przeczytałem pytanie. Nie jestem do końca pewien, co to oznacza: "SO, pierwszy węzeł jest posortowany alfabetycznie, drugi węzeł według malejącej masy".

Ale myślę, że chcesz, żeby klucz był pierwszy, sortuj według wartości node1; następnie sortuj według masy, najpierw największa sortowanie; posortuj według wartości node2. Zmieniłem kluczową funkcję zwracania krotki, która sortowałaby w ten sposób.

Powiązane problemy