2014-04-05 11 views
7

Ho una lista di tuple:Come ordinare una lista di tuple dal loro primo elemento?

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)] 

dopo la cernita:

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)] 

La prima elem ent di ciascuna tupla è la "x", e la seconda la "y". Sto spostando gli oggetti in una lista attraverso l'iterazione e usando questi tasti (Quindi, se voglio spostare qualcosa sull'asse x, devo passare attraverso tutta la colonna, e questo potrebbe causare un problema orribile che non sono essere in grado di risolvere).

Come posso ordinare le tuple in questo modo ?:

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

Ma questo non è l'ordinamento in base al loro primo elemento, quello è l'ordinamento in base al loro * secondo * elemento, quindi il primo. E 'questo che intendevi? –

+0

Penso che OP significhi 'primo elemento' essere' elemento all'indice 1' – inspectorG4dget

+0

intendevo il primo indice di ogni tupla (ora mi sono un po 'confuso, ma l'elenco finale in basso è lo "smistamento" che voglio raggiungere). –

risposta

13

È possibile utilizzare il parametro key della funzione sort, per ordinare le tuple. La funzione del parametro key consiste nel fornire un valore che deve essere utilizzato per confrontare due oggetti. Quindi, nel tuo caso, se si desidera che il sort di utilizzare solo il primo elemento nella tupla, si può fare qualcosa di simile

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

Se si desidera utilizzare solo il secondo elemento nella tupla, poi

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

sort passerà ogni elemento della lista alla funzione lambda si passa come parametro per key e utilizzerà il valore ritorna, per confrontare due oggetti nella lista. Quindi, nel tuo caso, supponiamo di avere due elementi nella lista come questa

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

e se si desidera ordinare dal secondo elemento, allora si farebbe

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

primo che passa (1, 3) alla funzione lambda che restituisce l'elemento nell'indice 1, che è 3 e che rappresenterà questa tupla durante il confronto. Allo stesso modo, 2 verrà utilizzato per la seconda tupla.

3

Questo dovrebbe fare il trucco

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

Mentre la soluzione di thefourtheye è corretta nel senso stretto che è esattamente quello che hai chiesto nel titolo. Potrebbe non essere in realtà ciò che desideri. Potrebbe essere meglio prenderlo un po 'più lontano ordinando invece il contrario della tupla.

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

Questo ti costringe ad avere un ordinamento come:

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

Invece di avere il primo elemento essere ordinata come:

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

Che è quello che ottengo quando si utilizza:

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

Per impostazione predefinita Py fa un tipo lessicografico da sinistra a destra. L'inversione della tupla fa in modo che Python faccia l'ordinamento lessicografico da destra a sinistra.

+0

Ho trovato che la sua risposta non era esattamente quello che volevo, ma ho capito come usarlo .. Usando entrambi [0] e [1]. self.gridKeys.sort (key = lambda x: x [0]) self.gridKeys.sort (key = lambda x: x [1]) Io analizzo la versione di esso, grazie :) . –

+0

Ho trovato la tua versione più elegante dell'uso di [0] e [1], e la sto usando :). –

+0

Pensavo potessi. Prego. – Nuclearman