Seite 1 von 1

Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Sonntag 17. November 2019, 21:59
von Atalanttore
Hallo

Ich habe mir wieder eine kleine Übungsaufgabe ausgedacht. Diesmal gibt es ein `dict()` mit Buchstaben als Schlüssel (z.B. "a") und Zahlen als Werte (z.B. 10).

In einer Liste sollen nun alle Schlüssel ausgegeben werden, die den höchsten Zahlenwert im Wörterbuch haben.

Code:

Code: Alles auswählen

pairs = {"a": 10,
         "b": 43,
         "c": 45,
         "d": 67,
         "e": 23,
         "f": 45,
         "g": 34,
         "h": 54,
         "i": 34,
         "j": 32,
         "k": 75,  # höchster Wert
         "l": 67,
         "m": 34,
         "n": 45,
         "o": 34,
         "p": 23,
         "q": 67,
         "r": 75,  # höchster Wert
         "s": 67,
         "t": 34,
         "u": 46,
         "v": 33,
         "w": 54,
         "x": 45,
         "y": 56,
         "z": 43}


def find_keys_with_highest_value(data):
    result = dict()
    for key, value in data.items():
        if not result.get(str(value)):
            result[str(value)] = list()
        result[str(value)].append(key)
    maximum_value = max(result.keys())
    return result[maximum_value]


print(find_keys_with_highest_value(pairs))
Ausgabe:

Code: Alles auswählen

['k', 'r']
Was haltet ihr von meiner Lösung?

Gruß
Atalanttore

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Sonntag 17. November 2019, 22:32
von Sirius3
Warum wandelst Du Zahlen in Strings um? Da hast Du Glück, dass alle Zahlen zwei Ziffern haben. Außerdem musst Du Dir ja nicht alles merken, es reicht, die größte Zahl und die Keys dazu zu speichern. Wird eine größere Zahl gefunden, einfach wieder mit einer leeren Liste anfangen.

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Montag 18. November 2019, 07:20
von Sirius3
Ungefähr so:

Code: Alles auswählen

def find_keys_with_highest_value(data):
    result = None
    highest_value = float('-inf')
    for key, value in data.items():
        if highest_value <= value:
            if highest_value < value:
                highest_value = value
                result = []
            result.append(key)
    return result

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Montag 18. November 2019, 21:13
von Atalanttore
@Sirius3: Danke für deinen verbesserten Code.

Als Schlüssel kann man auch Integer nehmen.
Sirius3 hat geschrieben: Sonntag 17. November 2019, 22:32 Da hast Du Glück, dass alle Zahlen zwei Ziffern haben.
Was meinst du damit genau?

Was bedeutet `float('-inf')`?

Gruß
Atalanttore

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Montag 18. November 2019, 21:27
von snafu
Geht auch kürzer:

Code: Alles auswählen

highest = max(pairs.values())
print([key for key in pairs if pairs[key] == highest])
Und falls nur ein Schlüssel gefragt wäre:

Code: Alles auswählen

print(max(pairs, key=pairs.get))

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Montag 18. November 2019, 21:34
von Atalanttore
@snafu: Danke für den Code.

Erst mit `max()` den höchsten Wert im Dictionary suchen und anschließend alle Schlüssel ausgeben, die diesen höchsten Wert haben. Eigentlich ganz logisch und einfach. :)

Gruß
Atalanttore

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Dienstag 19. November 2019, 00:02
von __blackjack__
@Atalanttore: Man kann als Schlüssel alles nehmen was ”hashable” ist und den ”Vertrag” zusammen mit der Vergleichsoperation erfüllt, dass aus ``a == b`` folgt das auch ``hash(a) == hash(b)`` gilt.

Du hast Glück das alle Zahlen die gleiche Anzahl von Ziffern haben weil der kleiner/grösser-Vergleich von Zeichenketten sonst nicht so funktioniert wie Du das gerne hättest, weil dann nicht der Zahlwert verglichen wird, sondern die Zeichenketten:

Code: Alles auswählen

In [154]: 2 < 10                                                                
Out[154]: True

In [155]: "2" < "10"                                                            
Out[155]: False
Die Frage zu ``float("-inf")`` sollte die Dokumentation beantworten können: https://docs.python.org/3.6/library/fun ... html#float

Hätte man auch mit der Konstante aus dem `math`-Modul als ``-math.inf`` schreiben können.

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Dienstag 19. November 2019, 16:14
von Atalanttore
@__blackjack__: Danke für die genaue Erklärung. Jetzt habe ich das Problem verstanden.

Der Begriff ”hashable” begegnet mir häufig bei Fehlermeldungen. Aus dem Python Glossar wird mir aber nicht klar, warum man bzw. Python so etwas überhaupt benötigt.

Was meinst du mit ”Vertrag”?

Gruß
Atalanttore

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Dienstag 19. November 2019, 16:15
von __deets__
Ein Vertrag ist eine Vereinbarung zwischen zwei oder mehr Parteien. Und in diesem Fall ist eine das dict, und die andere eine hash-Funktion, die sich eben auf bestimmte Art zu benehmen hat.

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Dienstag 19. November 2019, 16:20
von Atalanttore
@__deets__: Wieder was gelernt. Danke. "Verträge" sind mir bei Python bisher noch nie begegnet.

Gruß
Atalanttore

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Dienstag 19. November 2019, 16:26
von __deets__
Das ist ja auch nichts formales, sondern ein Konzept. Es gibt tatsaechlich formalere Umsetzungen wie "design by contract", die eben ein solches Verhalten auch noch etwas konkreter machen. Aber allgemeiner sagt man eben nur damit aus, dass man sich auf bestimmte Weise verhalten muss. Jenseits von zB Methodennamen und Argumenten.

Re: Alle Schlüssel mit höchstem Wert im `dict()` ausgeben

Verfasst: Dienstag 19. November 2019, 20:20
von Atalanttore
"design by contract" kannte ich auch noch nicht.