Wie sortiere ich eine Liste von Listen nach einem bestimmten Index der inneren Liste?

Antworten:

320

Dies ist ein Job für 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']]

Es ist auch möglich, hier eine Lambda-Funktion zu verwenden, jedoch ist die Lambda-Funktion in diesem einfachen Fall langsamer

John La Rooy
quelle
Was wäre, wenn ich den Fall ignorieren möchte?
Bzupnick
5
@bzupnick, benutze key=lambda x:x[2].casefold(). Wenn Ihr Python nicht neu genug ist, verwenden Sie einfach .lower()anstelle von.casefold()
John La Rooy
x = [[[5,3], 1,0345], [[5,6], 5,098], [[5,4], 4,89], [[5,1], 5,97]] Mit einer solchen Liste ist can wir sortieren mit itemgetter () in Bezug auf Elemente in x [0] [1]?
nidHi
Kann ich auch die Indizes der Sortierung abrufen, um eine andere verwandte Liste von Listen in derselben Reihenfolge zu sortieren?
Quarky
@quaryk Es klingt nach einer interessanten Frage, die aber in den Kommentaren nicht beantwortet werden kann. Wenn Sie keine entsprechende Frage finden, sollten Sie eine erstellen.
John La Rooy
175

an Ort und Stelle

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

nicht vorhanden mit sortiert:

>>> sorted(l, key=lambda x: x[2])
Mouad
quelle
4
Könnten Sie mehr Details über in placeund geben not in place?
qun
9
@qun, "an Ort und Stelle" bedeutet, dass der Speicher der alten Liste für die sortierte wiederverwendet wird. "nicht vorhanden" bedeutet, dass die alte Liste unverändert bleibt und eine neue Liste erstellt wird.
John La Rooy
x = [[[5,3], 1,0345], [[5,6], 5,098], [[5,4], 4,89], [[5,1], 5,97]] Mit einer Liste wie dieser ist, Wie können wir in Bezug auf Elemente in x [0] [1] sortieren?
nidHi
81

Mit Itemgetter können Sie nach mehreren Kriterien / Spalten sortieren:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))
fider
quelle
5
Ich denke, diese Antwort ist sehr wichtig. Ich denke, Leute, die versuchen, nach Indizes für innere Arrays zu sortieren, werden hierher fallen, aber Leute, die nach MEHREREN Indizes für innere Arrays sortieren möchten, werden hier beginnen, und Ihre Antwort hat mir geholfen zu sehen, dass Itemgetter das tatsächlich für Sie tun wird!
ZekeDroid
11

Mehrere Kriterien können auch über die Lambda-Funktion implementiert werden

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))
Rahul Kumar
quelle
10
array.sort(key = lambda x:x[1])

Mit diesem Snippet können Sie einfach sortieren, wobei 1 der Index des Elements ist.

Abhishek Yadav
quelle
8

So was:

import operator
l = [...]
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index))
Jim Brissom
quelle
8

Ich denke, die Lambda-Funktion kann Ihr Problem lösen.

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']]
Tushar Niras
quelle
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])**

Korrigieren Sie mich, wenn ich falsch liege, aber nicht das 'x [2]' das 3. Element in der Liste aufruft, nicht das 3. Element in der verschachtelten Liste? sollte es x [2] [2] sein?

EgmontDeVos
quelle
Nein, da key / lambda bereits die Elemente in der Liste der ersten Ebene durchläuft. x ist eine lokale Variable, die nacheinander an jedes Element gebunden ist.
DragonLord
1

Einfacher zu verstehen (Was macht Lambda eigentlich):

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)
Maz1978
quelle
0

Hier wird das Sortieren eines mehrdimensionalen Arrays ausgeführt

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)
Nishan
quelle