Hoe een lijst/tupel van lijsten/tupels sorteren op het element in een bepaalde index?

Ik heb wat gegevens in een lijst met lijsten of in een lijst met tuples, zoals deze:

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

En ik wil sorteren op het 2e element in de subset. Betekenis, sorteren op 2,5,8 waarbij 2van (1,2,3)is, 5van (4,5,6). Wat is de gebruikelijke manier om dit te doen? Moet ik tuples of lijsten in mijn lijst opslaan?


Antwoord 1, autoriteit 100%

sorted_by_second = sorted(data, key=lambda tup: tup[1])

of:

data.sort(key=lambda tup: tup[1])  # sorts in place

Antwoord 2, autoriteit 21%

from operator import itemgetter
data.sort(key=itemgetter(1))

Antwoord 3, autoriteit 5%

Voor sorteren op meerdere criteria, namelijk bijvoorbeeld op het tweede en derde element in een tuple, laat

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

en definieer dus een lambda die een tuple retourneert die prioriteit beschrijft, bijvoorbeeld

sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]

Antwoord 4, autoriteit 5%

Ik wil alleen iets toevoegen aan het antwoord van Stephen als je de array van hoog naar laag wilt sorteren, een andere manier dan in de opmerkingen hierboven is om dit gewoon aan de regel toe te voegen:

reverse = True

en het resultaat zal zijn als volgt:

data.sort(key=lambda tup: tup[1], reverse=True)

Antwoord 5, Autoriteit 2%

Stephen’s antwoord is degene die ik zou gebruiken . Voor de volledigheid, hier is de DSU (versieren-sort-undecorate) patroon met Lijstcomprehensies:

decorated = [(tup[1], tup) for tup in data]
decorated.sort()
undecorated = [tup for second, tup in decorated]

Of, meer kernachtig:

[b for a,b in sorted((tup[1], tup) for tup in data)]

Zoals in de Python sorteren HowTo Dit heeft onnodige sinds Python 2.4, bij het indrukken van functies die beschikbaar zijn geworden.


Antwoord 6, Autoriteit 2%

Om een ​​lijst met tupels (<word>, <count>)voor countaflopend en wordin alfabetische volgorde:

data = [
('betty', 1),
('bought', 1),
('a', 1),
('bit', 1),
('of', 1),
('butter', 2),
('but', 1),
('the', 1),
('was', 1),
('bitter', 1)]

Ik gebruik deze methode:

sorted(data, key=lambda tup:(-tup[1], tup[0]))

en het geeft me het resultaat:

[('butter', 2),
('a', 1),
('betty', 1),
('bit', 1),
('bitter', 1),
('bought', 1),
('but', 1),
('of', 1),
('the', 1),
('was', 1)]

Antwoord 7

Zonder lambda:

def sec_elem(s):
    return s[1]
sorted(data, key=sec_elem)

Antwoord 8

itemgetter()is iets sneller dan lambda tup: tup[1], maar de stijging is relatief bescheiden (ongeveer 10 tot 25 procent).

(IPython-sessie)

>>> from operator import itemgetter
>>> from numpy.random import randint
>>> values = randint(0, 9, 30000).reshape((10000,3))
>>> tpls = [tuple(values[i,:]) for i in range(len(values))]
>>> tpls[:5]    # display sample from list
[(1, 0, 0), 
 (8, 5, 5), 
 (5, 4, 0), 
 (5, 7, 7), 
 (4, 2, 1)]
>>> sorted(tpls[:5], key=itemgetter(1))    # example sort
[(1, 0, 0), 
 (4, 2, 1), 
 (5, 4, 0), 
 (8, 5, 5), 
 (5, 7, 7)]
>>> %timeit sorted(tpls, key=itemgetter(1))
100 loops, best of 3: 4.89 ms per loop
>>> %timeit sorted(tpls, key=lambda tup: tup[1])
100 loops, best of 3: 6.39 ms per loop
>>> %timeit sorted(tpls, key=(itemgetter(1,0)))
100 loops, best of 3: 16.1 ms per loop
>>> %timeit sorted(tpls, key=lambda tup: (tup[1], tup[0]))
100 loops, best of 3: 17.1 ms per loop

Antwoord 9

@Stephen’s antwoord is to the point! Hier is een voorbeeld voor een betere visualisatie,

Shout out voor de Ready Player One-fans!=)

>>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')]
>>> gunters.sort(key=lambda tup: tup[0])
>>> print gunters
[('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')]

keyis een functie die wordt opgeroepen om de items van de collectie te transformeren voor vergelijking .. zoals compareTomethode in Java.

De parameter die is doorgegeven aan de sleutel moet iets zijn dat vulbaar is. Hier creëert het gebruik van lambdaeen anonieme functie (die een vulbaar is).
De syntaxis van Lambda is het woord lambda gevolgd door een tiselijke naam dan een enkel blok code.

Hieronder voorbeeld, sorteren we een lijst met tuple die de info-abt-tijd van bepaalde gebeurtenis- en acteurnaam bevat.

We sorteren deze lijst op tijd van gebeurtenis Oval – wat het 0e element van een tuple is.

Opmerking – s.sort([cmp[, key[, reverse]]])Sorteert de items van S op zijn plaats


Antwoord 10

Ik gebruik dit in mijn code:

#To sort the list based on each element's second integer (elem[1])
sorted(d2, key=lambda elem: elem[1])

Afhankelijk van welk element u het wilt sorteren op u kunt het in de

plaatsen

(elem[*insert the index of the element you are sorting it by*])

Antwoord 11

Sorteren van een tuple is vrij eenvoudig:

tuple(sorted(t))

Other episodes