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


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

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

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

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

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


8

So was:

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

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

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?


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)

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.