Come ordinare un elenco di elenchi in base a un indice specifico dell'elenco interno?


Risposte:


321

Questo è un lavoro per itemgetter

>>> from operator import itemgetter
>>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> sorted(L, key=itemgetter(2))
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

È anche possibile utilizzare una funzione lambda qui, tuttavia la funzione lambda è più lenta in questo semplice caso


E se volessi ignorare il caso?
bzupnick,

5
@bzupnick, usa key=lambda x:x[2].casefold(). Se il tuo Python non è abbastanza nuovo, basta usare .lower()invece di.casefold()
John La Rooy il

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Con un elenco come questo è possibile ordiniamo usando itemgetter () rispetto agli elementi in x [0] [1]?
nidHi

Posso anche ottenere gli indici dell'ordinamento, in modo da ordinare un altro elenco di elenchi correlati nello stesso ordine?
Quarky,

@quaryk Sembra una domanda interessante, ma non adatta a rispondere nei commenti. Se non riesci a trovare una domanda che la copre, è necessario crearne una.
John La Rooy,

175

a posto

>>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> l.sort(key=lambda x: x[2])

non in atto utilizzando ordinati:

>>> sorted(l, key=lambda x: x[2])

4
Potresti fornire maggiori dettagli su in placee not in place?
qun,

9
@qun, "sul posto" significa che la memoria della vecchia lista viene riutilizzata per quella ordinata. "non in atto" significa che il vecchio elenco rimane invariato e viene creato un nuovo elenco.
John La Rooy,

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Con un elenco come questo è, come possiamo ordinare rispetto agli elementi in x [0] [1]?
nidHi

81

Itemgetter ti consente di ordinare in base a più criteri / colonne:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))

5
Penso che questa risposta sia molto importante. Penso che le persone che cercano di ordinare in base agli indici degli array interni cadranno qui, ma le persone che cercano di ordinare in base a MULTIPLI indici degli array interni inizieranno qui e la tua risposta mi ha aiutato a vedere che Itemgetter lo farà davvero per te!
ZekeDroid,

11

più criteri possono anche essere implementati attraverso la funzione lambda

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))

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

Puoi facilmente ordinare usando questo frammento, dove 1 è l'indice dell'elemento.


8

Come questo:

import operator
l = [...]
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index))

8

Penso che la funzione lambda possa risolvere il tuo problema.

old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]

#let's assume we want to sort lists by last value ( old_list[2] )
new_list = sorted(old_list, key=lambda x: x[2])

#Resulst of new_list will be:

[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

2
**old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]
    #let's assume we want to sort lists by last value ( old_list[2] )
    new_list = sorted(old_list, key=lambda x: x[2])**

correggimi se sbaglio ma non è la 'x [2]' che chiama il terzo elemento nell'elenco, non il terzo elemento nell'elenco nidificato? dovrebbe essere x [2] [2]?


No, perché key / lambda sta già ripetendo gli elementi nell'elenco di primo livello. x è una variabile locale associata a ciascun elemento a sua volta.
DragonLord,

1

Più facile da capire (cosa sta facendo Lambda):

ls2=[[0,1,'f'],[4,2,'t'],[9,4,'afsd']]
def thirdItem(ls):
    #return the third item of the list
    return ls[2]
#Sort according to what the thirdItem function return 
ls2.sort(key=thirdItem)

0

L'ordinamento di un array multidimensionale viene eseguito qui

arr=[[2,1],[1,2],[3,5],[4,5],[3,1],[5,2],[3,8],[1,9],[1,3]]



arr.sort(key=lambda x:x[0])
la=set([i[0] for i in Points])

for i in la:
    tempres=list()
    for j in arr:
        if j[0]==i:
            tempres.append(j[1])

    for j in sorted(tempres,reverse=True):
        print(i,j)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.