it-swarm.com.de

Liste der Tupel nach zweitem Element sortieren (ganzzahliger Wert)

Ich habe eine Liste von Tupeln, die ungefähr so ​​aussieht:

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

Ich möchte diese Liste in aufsteigender Reihenfolge nach dem ganzzahligen Wert in den Tupeln sortieren. Ist es möglich?

358
Amyth

Verwenden Sie das Schlüsselwort key mit sorted().

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

key sollte eine Funktion sein, die angibt, wie das vergleichbare Element aus Ihrer Datenstruktur abgerufen werden kann. In Ihrem Fall ist es das zweite Element des Tupels, daher greifen wir auf [1] zu.

Zur Optimierung siehe jamylaks Antwort mit itemgetter(1), was im Wesentlichen eine schnellere Version von lambda x: x[1] ist.

554
cheeken
>>> 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 mit itemgetter ist in diesem Fall besser lesbar als die Lösung von @cheeken. Es ist auch schneller, da fast die gesamte Berechnung auf der Seite c (kein Wortspiel beabsichtigt) und nicht durch die Verwendung von lambda erfolgt.

>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
186
jamylak

Als python Neuling wollte ich nur erwähnen, dass, wenn die Daten tatsächlich so aussehen:

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

dann würde sorted() automatisch nach dem zweiten Element im Tupel sortieren, da die ersten Elemente alle identisch sind.

39
Angus

Zur Antwort von Cheeken hinzufügen: So sortieren Sie eine Liste von Tupeln nach dem zweiten Element in absteigende Reihenfolge.

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

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

Verwenden Sie für eine direkte Sortierung

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

Definieren Sie für eine Lambda-Vermeidungsmethode zunächst Ihre eigene Funktion:

def MyFn(a):
    return a[1]

dann:

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

Für Python 2.7+ funktioniert dies, wodurch die akzeptierte Antwort etwas lesbarer wird:

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

Die Tatsache, dass die Sortierwerte im OP Ganzzahlen sind, ist für die eigentliche Frage nicht relevant. Mit anderen Worten, die akzeptierte Antwort würde funktionieren, wenn der Sortierwert Text wäre. Ich erwähne dies auch, um darauf hinzuweisen, dass die Sortierung während der Sortierung geändert werden kann (z. B. um Groß- und Kleinschreibung zu berücksichtigen).

>>> 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')]
0
DaveL17