Derzeit versuche ich mehr darüber zu lernen, wie man Verständnis nutzt. Ich bin jedoch mit diesem Problem festgefahren, das ich gerade habe.

Das Wörterbuch, das ich habe:

d =  {'Second': {('Carrie', 3), ('Diane', 3), ('Bob', 3)},
      'Third': {('Alan', 2), ('Diane', 5)},
      'Fourth': {('Carrie', 2), ('Alan', 5)},
      'First': {('Bob', 5), ('Carrie', 5), ('Alan', 1), ('Diane', 1)} }

Ich versuche, es nach der Anzahl der Werte zu sortieren, die jeder Schlüssel hat, damit es bei der Rückgabe so aussieht. Wenn beide Schlüssel dieselbe Anzahl von Werten haben, wird sie alphabetisch sortiert.

Gewünschte Ausgabe:

['First', 'Second', 'Fourth', 'Third']

Was ich bisher habe, ich bin mir nicht sicher, wie ich nach der Länge der Werte sortieren soll:

d = {'Second': {('Carrie', 3), ('Diane', 3), ('Bob', 3)}, 'Third': {('Alan', 2), ('Diane', 5)}, 'Fourth': {('Carrie', 2), ('Alan', 5)}, 'First': {('Bob', 5), ('Carrie', 5), ('Alan', 1), ('Diane', 1)} }

def sorting(d):
    return sorted([key for key, value in db.items(), key = lambda x: -len( )
2
user10583992 18 Jän. 2019 im 04:45

3 Antworten

Beste Antwort

Erstellen Sie ein Wörterbuch, das die Schlüssel ihrer Länge zuordnet, und rufen Sie dann sorted auf.

d2 = {k: len(d[k]) for k in d}
sorted(d2, key=d2.get, reverse=True)
# ['First', 'Second', 'Third', 'Fourth']

Die Verwendung eines lambda würde die Notwendigkeit einer Zuordnung beseitigen, würde aber auch bedeuten, dass der Schlüssel eine lambda -Funktion ist, ... aber hier ist es:

sorted(d, key=lambda k: (len(d[k]), k), reverse=True)
# ['First', 'Second', 'Third', 'Fourth']

Hier gibt der Schlüsselrückruf ein Tupel (len(d[k]), k) zurück, das sicherstellt, dass die Sortierung zuerst nach Länge und dann in alphabetischer Reihenfolge erfolgt.


Als dummer Einzeiler können Sie dies tun:

(lambda d: sorted(d, key=d.get, reverse=True))({k: len(d[k]) for k in d}) 
# ['First', 'Second', 'Third', 'Fourth']

Dies ist nur ein Ersatz für Zuweisungsausdrücke. Ich warte auf Python-3.8.

1
cs95 18 Jän. 2019 im 01:52

Sie können den Parameter reverse in der Funktion sorted verwenden:

results = [a for a, _ in sorted(d.items(), key=lambda x:len(x[-1]), reverse=True)]

Ausgabe:

['First', 'Second', 'Third', 'Fourth']
0
Ajax1234 18 Jän. 2019 im 01:47

Haben Sie einfach ein lambda, das zwei Werte zurückgibt. Die Länge des Werts und eine Liste der negativen ord aller Zeichen im Schlüssel, um die reverse = True für die alphabetische Sortierung zu negieren.

print(sorted(d.keys(), key = lambda a: (len(d[a]), [-ord(c.lower()) for c in a]), reverse = True))
#['First', 'Second', 'Fourth', 'Third']
0
All Knower 18 Jän. 2019 im 02:08