Sorteer een lijst met tuples op 2e item (gehele waarde)

Ik heb een lijst met tuples die er ongeveer zo uitziet:

[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]

Ik wil deze lijst in oplopende volgorde sorteren op de integerwaarde binnen de tupels. Is het mogelijk?


Antwoord 1, autoriteit 100%

Probeer het trefwoord keyte gebruiken met sorted().

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda x: x[1])

keymoet een functie zijn die identificeert hoe het vergelijkbare element uit uw gegevensstructuur kan worden opgehaald. In jouw geval is dit het tweede element van de tuple, dus we hebben toegang tot [1].

Zie voor optimalisatie de reactie van jamylak met behulp van itemgetter(1), wat in wezen een snellere versie is van lambda x: x[1].


Antwoord 2, autoriteit 29%

>>> from operator import itemgetter
>>> data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
>>> sorted(data,key=itemgetter(1))
[('abc', 121), ('abc', 148), ('abc', 221), ('abc', 231)]

IMO met itemgetteris in dit geval beter leesbaar dan de oplossing van @cheeken. Het is
ook sneller omdat bijna alle berekeningen aan de c-kant worden gedaan (geen woordspeling bedoeld) in plaats van door het gebruik van lambda.

>python -m timeit -s "from operator import itemgetter; data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=itemgetter(1))"
1000000 loops, best of 3: 1.22 usec per loop
>python -m timeit -s "data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=lambda x: x[1])"
1000000 loops, best of 3: 1.4 usec per loop

Antwoord 3, autoriteit 7%

Toevoegend aan het antwoord van Cheeken,
Zo sorteert u een lijst met tuples op het tweede item in aflopende volgorde.

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)

Antwoord 4, autoriteit 6%

Als python-neofiet wilde ik alleen vermelden dat als de gegevens er echt zo uit zouden zien:

data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]

dan zou sorted()automatisch sorteren op het tweede element in de tuple, aangezien de eerste elementen allemaal identiek zijn.


Antwoord 5, autoriteit 3%

Gebruik voor een in-place sortering

foo = [(list of tuples)]
foo.sort(key=lambda x:x[0]) #To sort by first element of the tuple

Antwoord 6, autoriteit 2%

Van python-wiki:

>>> from operator import itemgetter, attrgetter    
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]    
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Antwoord 7

Definieer voor een lambda-vermijdende methode eerst uw eigen functie:

def MyFn(a):
    return a[1]

dan:

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)

Antwoord 8

Voor Python 2.7+werkt dit, wat het geaccepteerde antwoord iets leesbaarder maakt:

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)

Antwoord 9

Het feit dat de sorteerwaarden in het OP gehele getallen zijn, is niet relevant voor de vraag op zich. Met andere woorden, het geaccepteerde antwoord zou werken als de sorteerwaarde tekst was. Ik breng dit naar voren om er ook op te wijzen dat de sortering tijdens de sortering kan worden gewijzigd (bijvoorbeeld om rekening te houden met hoofdletters en kleine letters).

>>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: x[1])
[(148, 'ABC'), (221, 'DEF'), (121, 'abc'), (231, 'def')]
>>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: str.lower(x[1]))
[(121, 'abc'), (148, 'ABC'), (231, 'def'), (221, 'DEF')]

Other episodes