Key mit den meisten Werten in dictionary erhalten?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
saibot9393
User
Beiträge: 12
Registriert: Dienstag 11. Juni 2019, 07:02

Ich habe ein dictionary: Schlüssel sind Zeichenfolgen, Werte sind Arrays mit Fließkommazahlen.

Beispiel:

dict = {'s': array([0., 1., 2.]), 't': array([0.00000000e+00, 1.25885010e-03, 2.51770020e-03, ..., 'p': array([0.050354 , 0.10070801, 0.15106201}

Ich würde gerne ' 't'' als Antwort bekommen, da dies der Schlüssel mit den meisten Werten ist.

Vielen Dank für jede Antwort!
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

max(dict.values(), key=len)
Zuletzt geändert von snafu am Mittwoch 3. Juli 2019, 08:13, insgesamt 1-mal geändert.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

dict ist ein keyword in Python und sollte nicht als Variablenbezeichner verwendet werden, außerdem ist der Name wenig aussagekräftig weil damit nicht wirklich hervorgeht, *was* für ein Inhalt das Wörterbuch bereithält. Das selbe trifft hierbei auf 's', 't' und 'p' zu.

array als keyword kennt Python wiederrum nicht, was du für die oben gezeigte Datenstruktur verwenden möchtest sind Listen (list), oder einfacher nur in eckige Klammern:

Am Ende könnte das ganze so aussehen:

Code: Alles auswählen

>>> values = {'s': [0., 1., 2.], 't':[0.00000000e+00, 1.25885010e-03, 2.51770020e-03], 'p': [0.050354 , 0.10070801, 0.15106201]}
>>> values['t']
[0.0, 0.0012588501, 0.0025177002]
>>> 
Das sind absolute Grundlagen und Teil einer jeden anständigen Python-Dokumentation.

EDIT: deine eigentliche Frage ging bei mir etwas unter, siehe dazu snafu's Antwort.
When we say computer, we mean the electronic computer.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@snafu: er will den Schlüssel zum längsten wert.

Code: Alles auswählen

k= max(dict.items(), key=lambda item: len(item[1]))[0]
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@saibot9393: die Antwort wäre, nachzufragen, was Du denn schon versucht hast, und wo Du konkret nicht weiter gekommen bist,
aber snafu hat ja schon Code gepostet. Zum Glück ist snafus Lösung nicht die Komplettlösung, Du kannst also noch selbst nachdenken, wie denn die Aufgabe anzugehen ist.

@sls: ich denke, s, t und p sind nur Beispiel-Schlüssel, und hoffe, die realen sind aussagekräftiger. `array` ist die Repräsentation von numpy-Arrays, und die ganze Zeile wohl die Repräsentation eines Wörterbuchs, das hier als Pseudo-Eingabe hineinkopiert worden ist, das zeigt sich auch an den ... und den fehlenden Klammern.

Die selbe Frage mit mehr kopiertem Code ist übrigens hier. Da wurde aber auch keine Musterlösung geliefert und auch nicht die Grundlagen von Python telepatisch übermittelt.

EDIT: __deets__ hat ja jetzt den Versuch aus seinem anderen Beitrag korrigiert.
Wenn man nur den Schlüssel will, würde ich

Code: Alles auswählen

max_key = max(vars, key=lambda v: len(vars[key]))
schreiben.
saibot9393
User
Beiträge: 12
Registriert: Dienstag 11. Juni 2019, 07:02

Das dict ist nur ein Beispiel Wörterbuch. In dem eigentlichen gibt es noch viele weitere keys mit values.

Mit diesem Befehl werden mir die keys mit Längenangabe angezeigt:
key_to_value_lengths = {k: len(v) for k, v in vars.items()}


In[2]: key_to_value_lengths
Out[2]:
{ 'SK_5': 1,
'SK_6': 9,
'SK_7': 10,
'SK_8': 10,
'SK_9': 10,
'SK_10': 10,
't_MF': 4020,
'ts': 101,
'tf': 4020,
'MF': 4020,
'MH': 4020,
'F': 4020,
'n': 4020,
'P_1': 4020,
'P_2': 4020,
'P_3': 4020,
'Q': 101,
...}

Nun möchte ich nur die keys mit den dazugehörigen values, mit den meisten Werten (hier 4020; diese Zahl kann aber auch variieren), in einem Wörterbuch stehen haben. Mir wird aber nur der Inhalt des keys 't_MF' ausgegeben? Wo könnte der Fehler liegen? Vielen Dank im Voraus für jede Antwort.


new_dict = {}
for keys in key_to_value_lengths:
largest = max(vars, key=lambda k: len(vars[k]))
new_dict = [vars for i in largest if i in vars]
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

1. Benutze die code-Tags damit die Einrückung erhalten bleibt (unter dem Eingabefeld auf "Vollständiger Editor & Vorschau" und dort der Button mit </> und zwischen die Code-Tags den Code posten.

2. Was denkst du denn, was die Zeilen 3 und 4 tun?
saibot9393
User
Beiträge: 12
Registriert: Dienstag 11. Juni 2019, 07:02

Code: Alles auswählen

new_dict = {}
for keys in key_to_value_lengths:
 largest = max(vars, key=lambda k: len(vars[k]))
 new_dict[largest] = values
Was muss ich ändern, damit mir alle keys mit den entsprechenden Werten in new_dict ausgegeben werden?
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@saibot9393: Den Code. 😉

Du müsstest verstehen was Du da machst, denn die vier Zeilen dort machen überhaupt gar keinen Sinn. Deswegen hat sparrow nachgefragt was Du denkst was der Code da macht. Das sieht alles extrem geraten aus, und ist teilweise auch gar nicht lauffähig. Im letzten Beitrag ist `values` beispielsweise gar nicht definiert. Und die Frage von sparrow bezog sich ziemlich sicher auf den Umstand das `largest` in jedem Schleifendurchlauf den gleichen Wert hat, weil der Ausdruck überhaupt nicht von der Laufvariable der Schleife abhängt. Davon hängt tatsächlich *gar nichts* ab, was ziemlich unsinnig aussieht. `keys` ist als Name falsch, denn da wird nur *ein* Schlüssel pro Schleifendurchlauf gebunden. `new_dict` ist ein schlechter Name weil er nichts über die Bedeutung des Inhalts aussagt und einen Grunddatentyp enthält.

Es geht hier um den Umgang mit Grunddatentypen und sehr grundlegenden Funktionen. Das musst *Du* letztendlich lernen. IMHO ist es da wenig hilfreich immer wieder Lösungen zu liefern, aus denen Du anscheinend keinen Erkenntnisgewinn ableitest.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
saibot9393
User
Beiträge: 12
Registriert: Dienstag 11. Juni 2019, 07:02

tatsächlich ist der Code lauffähig. Das ist nur ein kleiner Ausschnitt meines Codes. Ich habe auf einen Hinweis gehofft, ich weiß bereits dass ich erst seit kurzem programmiere und der code schlecht ist...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

max liefert eben immer nur einen Wert. Und du hast diesen Code so bekommen (ist ja nicht deiner) weil du nach dem größten wert gefragt hast. Jetzt plötzlich sollen es mehrere Werte sein. Ein bisschen mehr Sorgfalt in deiner problembeschreibung wäre also vielleicht mal eine gute idee. Was machst du da, was brauchst du? Und zwar mal mit etwas mehr Kontext.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Wie lange man programmiert ist egal. Versehen muss man das, was man tut, trotzdem. Es wird nur deutlich eleganter, wenn man mehr Erfahrung hat.
Du rätst hier im Moment - und so funktioniert Programmieren nicht.

Du musst erst einmal festlegen, was die Ausgangsdaten sind. Und _nur die_ sind für deine Lösung relevant.
Aus deinem Post entnehme ich, dass das hier die Ausgangsdaten sind:

Code: Alles auswählen

DATA = { 'SK_5': 1,
'SK_6': 9,
'SK_7': 10,
'SK_8': 10,
'SK_9': 10,
'SK_10': 10,
't_MF': 4020,
'ts': 101,
'tf': 4020,
'MF': 4020,
'MH': 4020,
'F': 4020,
'n': 4020,
'P_1': 4020,
'P_2': 4020,
'P_3': 4020,
'Q': 101}
Als nächstes musst du für dich definieren, wie das Ergebnis aussehen soll. Ein dictionary ist eine Schlüssel:Wert-Kombination. Was soll denn da Schlüssel sein und was der Wert? Bist du sicher, dass du ein dictionary als Ergebnis haben möchtest?

Und wenn du Ausgangssituation und Ziel definiert hast, musst du dir die einzelnen Schritte überlegen, wie du dorthin kommst.

Und hier der obligatorische Link auf das offizielle Tutorial, mit dem man in Python eingeführt wird.
saibot9393
User
Beiträge: 12
Registriert: Dienstag 11. Juni 2019, 07:02

@__deets__

Ja ich habe gehofft mit der Antwort als Ansatz, dann selber auf die Lösung zu bekommen..

Meine Problembeschreibung ist folgende: Ich habe ein Wörterbuch mit verschieden keys und verschiedenen Längen (Anzahl der Werte in einem key nicht der key name). Ich möchte die keys mit den meisten Werten filtern, also als erstes die längste(n) Serie(n) finden mit x werten und dann alle Werte mit der Länge x filtern und nur diese Werte im Wörterbuch speichern.


@sparrow
ja es ist für mich als Angang einfach zu schwierig, aber ich muss das irgendwie hinbekommen..
Meine Ausgangsdaten werden ganz ursprünglich aus .dat Dateien gezogen, die binär Dateien beinhalten, welche ich erst einmal aufbereiten musste. Es ist alles sehr komplex.

Ich möchte das alte dictionary filtern, damit nur noch keys mit der gleichen maximalen Länge enthalten bleiben. Das Umsetzen ohne Erfahrung und gefestigte Grundkenntnisse fällt mir sehr schwer
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@saibot:
Na dann Schritt für Schritt.
Als erstes musst du ja ermitteln, welche die maximale Anzahl von Werten in den einzelnen Values ist. Das tust du wie, bei dem folgenden dict?

Code: Alles auswählen

DATA = {
    "A": [1, 1, 1, 1],
    "B": [2, 2],
    "C": [3, 3, 3, 3],
    "D": [4, 5],
    "E:" [6]}
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@saibot:
Na dann Schritt für Schritt.
Als erstes musst du ja ermitteln, welche die größte Anzahl von Werten in den einzelnen Values ist. Das tust du wie, bei dem folgenden dict?

Code: Alles auswählen

DATA = {
    "A": [1, 1, 1, 1],
    "B": [2, 2],
    "C": [3, 3, 3, 3],
    "D": [4, 5],
    "E": [6,]}
saibot9393
User
Beiträge: 12
Registriert: Dienstag 11. Juni 2019, 07:02

Könnte ich theoretisch mit dem weiter arbeiten?

Code: Alles auswählen

key_to_value_lengths = {k: len(v) for k, v in data.items()}
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@saibot9393: dann hast Du ein Wörterbuch mit allen Längen als Werten. Was Du aber brauchst, ist einfach nur die maximal Länge aller Werte Deines ursprünglichen Wörterbuchs. Wie würdest Du die maximale Länge ermitteln?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist doch geraten. Was gibt dir das? Du kannst dir das doch anzeigen lassen. Ist das was du brauchst? Wenn nein, warum dann die Frage?

Wenn du etwas aus einer Datenstruktur entfernen willst (oder eine neue aufbauen mit weniger Werten), dann brauchst du dafuer eine Entscheidung, ob etwas dazu gehoert oder nicht. Siehst du da eine solche Entscheidung? Was macht man in Python, WENN (kleiner Hinweis...) man sowas entscheiden will?
saibot9393
User
Beiträge: 12
Registriert: Dienstag 11. Juni 2019, 07:02

Genau hierzu finde ich keine Lösung :/ im Internet wird immer nur nach dem maximalen Wert gefragt, aber nicht die Länge

@__deets__

vermutlich brauche ich hierzu eine if-Schleife?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Autsch. http://if-schleife.de/

Aber ansonsten: ja. Der Ausdruck den du da hingeschrieben hast nennt sich dictionary comprehension. Ein Tutorial dazu findet sich zB hier:

https://www.datacamp.com/community/tuto ... prehension

Da findest du auch etwas, bei dem du eine if-Anweisung einsetzen kannst.
Antworten