/ / Benutzerdefinierte Sortierung einer Liste von Tupeln - Python, Liste, Sortierung, Datenstrukturen

Benutzerdefinierte Art einer Liste von Tupeln - Python, Liste, Sortierung, Datenstrukturen

Ich habe erst vor wenigen Tagen mit Python angefangen und wollte mein kleines Projekt darin implementieren. Ich muss eine Liste von sortieren (string, integer) in absteigender Reihenfolge nach dem Zahlenwert, aber alphabetisch, wenn die Anzahl für mehr als ein Tupel identisch ist Ich habe also eine Liste, sage:

tuples = [("ggg", 5), ("aaa", 5), ("bbb", 6), ("zzz", 6)]
tuples.sort(key=lambda score: score[1], reverse=True)

Das gibt zurück:

[("bbb", 6), ("zzz", 6), ("ggg", 5), ("aaa", 5)]

Aber was ich will, ist:

[("bbb", 6), ("zzz", 6), ("aaa", 5), ("ggg", 5)]

In Java habe ich gerade einen Vergleicher für ein benutzerdefiniertes Tupel implementiert:

class Pair {
public final String s;
public final Integer i;

public Pair(String s, Integer i) {
this.s = s;
this.i = i;
}
}

class PairComparator implements Comparator<Pair> {

@Override
public int compare(Pair p1, Pair p2) {
int c = p1.i.compareTo(p2.i);
return (c == 0) ? p1.s.compareTo(p2.s) : c * (-1);
}
}

Aber ich bin mir nicht sicher, wie ich das in einer lambda Ausdruck in Python.

Antworten:

2 für die Antwort № 1

Vielleicht wäre der einfachste Weg gewesen key Gib ein Tupel zurück und multipliziere die Punktzahl mit -1. Zum Beispiel:

>>> tuples.sort(key=lambda x: (-x[1], x[0]))
>>> tuples
[("bbb", 6), ("zzz", 6), ("aaa", 5), ("ggg", 5)]

Dadurch werden die Ganzzahlen in absteigender Reihenfolge und die Zeichenfolgen in aufsteigender Reihenfolge sortiert.


1 für die Antwort № 2

Sie können einfach anhand der negativen Form der Zahl sortieren und verwenden Sie keine reverse=True :

>>> >>> tuples.sort(key=lambda x:(-x[1],x[0]))
>>> tuples
[("bbb", 6), ("zzz", 6), ("aaa", 5), ("ggg", 5)]

0 für die Antwort № 3

Eine andere Möglichkeit besteht darin, sie mit Hilfe der Operator-Modul-Funktion zweimal zu sortieren operator.itemgetter(). Wir sortieren zuerst nach dem ersten Element in aufsteigender Reihenfolge und dann nach dem zweiten Element in absteigender Reihenfolge (obwohl dies weniger effizient ist).

In [1]: from operator import itemgetter

In [2]: tuples = [("ggg", 5), ("aaa", 5), ("bbb", 6), ("zzz", 6)]

In [3]: tuples.sort(key=itemgetter(0)) # [("aaa", 5), ("bbb", 6), ("ggg", 5), ("zzz", 6)]

In [4]: tuples.sort(key=itemgetter(1), reverse=True) # sort by 2nd element in descending order

In [5]: tuples
Out[5]: [("bbb", 6), ("zzz", 6), ("aaa", 5), ("ggg", 5)]