2015-07-15 34 views
6

Chciałbym uporządkować listę 2D, gdzie każdy „rząd” ma wielkość 2, podobnie jak na przykładSortowanie za pomocą funkcji porównanie funkcji

[[2,5],[2,3],[10,11]] 

Te wiersze reprezentują zakresy w rzeczywistości, więc jej zawsze [a , b] gdzie chcę sortować dokładnie w ten sposób, każdy element listy będący 2-listą, bym miał (według porządku priorytetu): [a1, b1] [a2, b2]

1. If a1 < a2 do not permute 
2. If a1 > a2 permute 
3. If a1 == a2 then permute if (b1 - a1) > (b2 - a2) 

To, co uważam za głupie, to to, że pyton nie pozwala już na funkcje porównawcze. Zamiast tego wykorzystuje kluczową funkcję. W żaden sposób nie mogę zrobić z tego ważnego klucza, ponieważ opieram moje porównanie na dwóch parametrach, wartości liczbowej "a" (która przeważa), a następnie długości zakresu (b - a).

Jak mogę to posortować? Mam na myśli, bez wywoływania dwa razy sortowane() lub coś, co moim zdaniem jest brzydkie.

Czy to możliwe? Czy jest coś, czego nie widzę?

Dzięki!

+0

podczas wywoływania sortowane (elementy, cmp = func) na Python 3.3.3 daje mi „«cmp»jest niepoprawny argument kluczowe dla tej funkcji” – Yannick

+0

[docs] (https://docs.python.org/3/howto/sorting.html) oferuje funkcję konwersji 'cmp' to' key', ale nie jest aż tak ładna. –

+1

Możesz także utworzyć klasę dla wewnętrznej listy i zastąpić funkcję ['__cmp__'] (https://docs.python.org/2/reference/datamodel.html#object.__cmp__) –

Odpowiedz

5

Chociaż istnieją przypadki, które nie mogą być obsługiwane przez key. To nie jest jedna z nich. Rozwiązaniem jest, aby funkcyjny zwróci tuple

>>> L = [[2, 5], [2, 3], [10, 11]] 
>>> sorted(L, key=lambda x:(x[0], x[1] - x[0])) 
[[2, 3], [2, 5], [10, 11]] 
+0

Jestem ciekawa przypadków, które nie mogą być rozwiązane za pomocą 'klucza'. Czy masz przykład, proszę? – Delgan

+0

Wielkie dzięki! Po drugie @Delgan, byłoby miło wiedzieć, które przypadki nie mogą zostać rozwiązane (nie byłam świadoma, że ​​krotki to działające rozwiązanie). – Yannick

+0

@Delgan, Załóżmy, że lista podlist jest "[imię, nazwisko]" Muszę sortować według nazwiska. Tam, gdzie nazwiska są sobie równe, muszę sortować według imienia, ale w odwrotnej kolejności. –

Powiązane problemy