2014-04-05 13 views
7

Mam listę krotek:Jak posortować listę krotek według ich pierwszego elementu?

self.gridKeys = self.gridMap.keys() # The keys of the instance of the GridMap (It returns the product of every possible combination of positions in the specified grid, in tuples.) 
print self.gridKeys 

self.gridKeys:

[(7, 3), (6, 9), (0, 7), (1, 6), (3, 7), (2, 5), (8, 5), (5, 8), (4, 0), (9, 0), (6, 7), (5, 5), (7, 6), (0, 4), (1, 1), (3, 2), (2, 6), (8, 2), (4, 5), (9, 3), (6, 0), (7, 5), (0, 1), (3, 1), (9, 9), (7, 8), (2, 1), (8, 9), (9, 4), (5, 1), (7, 2), (1, 5), (3, 6), (2, 2), (8, 6), (4, 1), (9, 7), (6, 4), (5, 4), (7, 1), (0, 5), (1, 0), (0, 8), (3, 5), (2, 7), (8, 3), (4, 6), (9, 2), (6, 1), (5, 7), (7, 4), (0, 2), (1, 3), (4, 8), (3, 0), (2, 8), (9, 8), (8, 0), (6, 2), (5, 0), (1, 4), (3, 9), (2, 3), (1, 9), (8, 7), (4, 2), (9, 6), (6, 5), (5, 3), (7, 0), (6, 8), (0, 6), (1, 7), (0, 9), (3, 4), (2, 4), (8, 4), (5, 9), (4, 7), (9, 1), (6, 6), (5, 6), (7, 7), (0, 3), (1, 2), (4, 9), (3, 3), (2, 9), (8, 1), (4, 4), (6, 3), (0, 0), (7, 9), (3, 8), (2, 0), (1, 8), (8, 8), (4, 3), (9, 5), (5, 2)] 

po sortowaniu:

self.gridKeys = self.gridMap.keys() # The keys of the instance of the GridMap (It returns the product of every possible combination of positions in the specified grid, in tuples.) 
self.gridKeys.sort() # They're dicts, so they need to be properly ordered for further XML-analysis. 
print self.gridKeys 

self.gridKeys:

[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)] 

Pierwszy elem ent każdej krotki to "x", a po drugie "y". Przemieszczam obiekty na liście poprzez iterację i używanie tych klawiszy (więc, jeśli chcę przesunąć coś w osi X, muszę przejść przez całą kolumnę i to może powodować okropny problem, którym nie jestem być w stanie rozwiązać).

Jak mogę posortować krotki w ten sposób ?:

[(1, 0), (2, 0), (3, 0), (4, 0), (5, 0), ...] 
+0

Ale to nie sortowanie ich według ich pierwszego elementu, to sortowanie według ich * drugiego * elementu, a następnie ich pierwszego. Czy to miałeś na myśli? –

+0

Myślę, że OP oznaczał "pierwszy element" jako element w indeksie 1' – inspectorG4dget

+0

Miałem na myśli pierwszy indeks każdej krotki (Teraz mam trochę zdezorientowany, ale ostateczna lista na dole to "sortowanie", które chcę osiągnąć). –

Odpowiedz

13

Można użyć parametru funkcji sortkey, aby posortować krotki. Funkcją parametru key jest podanie wartości, która ma zostać użyta do porównania dwóch obiektów. Tak więc, w przypadku, jeśli chcesz sort używać tylko pierwszy element w krotce, można zrobić coś takiego

self.gridKeys.sort(key=lambda x: x[0]) 

Jeśli chcesz używać tylko drugi element w krotce, następnie

self.gridKeys.sort(key=lambda x: x[1]) 

sort funkcja przejść każdy i każdy element w liście do funkcji lambda możesz przekazać jako parametr do key i użyje wartości powraca, aby porównać dwa obiekty na liście. Tak więc, w przypadku, powiedzmy, że masz dwie pozycje na liście jak ten

data = [(1, 3), (1, 2)] 

a jeśli chcesz, aby posortować według drugiego elementu, wtedy byś zrobił

data.sort(key=lambda x: x[1]) 

Najpierw przechodzi (1, 3) do funkcji lambda, która zwraca element o indeksie 1, który jest 3 i który będzie reprezentował tę krotkę podczas porównania. W ten sam sposób, 2 zostanie użyty dla drugiej krotki.

3

To powinno załatwić sprawę

import operator 
self.gridKeys.sort(key=operator.itemgetter(1)) 
2

Podczas gdy rozwiązanie thefourtheye jest poprawne w ścisłym tego słowa znaczeniu, jest to dokładnie to, o co prosiłeś w tytule. Może nie być tym, czego chcesz. Lepszym rozwiązaniem może być odebranie go nieco dalej poprzez sortowanie odwrotnością krotki.

self.gridKeys.sort(key=lambda x:tuple(reversed(x))) 

Zmusza cię mieć zamawianie takich jak:

[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), ...] 

Zamiast pierwszy element być nieuporządkowane jak:

[(4, 0), (9, 0), (6, 0), (1, 0), (3, 0), ...] 

co jest, co otrzymuję przy użyciu:

self.gridKeys.sort(key=lambda x: x[1]) 

Domyślnie Py thon robi sortowanie leksykograficzne od lewej do prawej. Odwracanie krotki skutecznie sprawia, że ​​Python robi sortowanie leksykograficzne od prawej do lewej.

+0

Znalazłem, że jego odpowiedź nie była dokładnie tym, czego chciałem, ale wymyśliłem, jak go użyć. Używanie obu [0] i 1]. self.gridKeys.sort (klucz = lambda x: x [0]) self.gridKeys.sort (klucz = lambda x: x [1]) Przeanalizuję twoją wersję tego, dziękuję :) . –

+0

Znalazłem twoją wersję bardziej elegancką niż używając [0] i [1], i używam jej :). –

+0

Myślałem, że możesz. Proszę bardzo. – Nuclearman

Powiązane problemy