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!
Key mit den meisten Werten in dictionary erhalten?
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.
- 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:
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.
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]
>>>
EDIT: deine eigentliche Frage ging bei mir etwas unter, siehe dazu snafu's Antwort.
When we say computer, we mean the electronic computer.
@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]
@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
schreiben.
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]))
-
- 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]
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]
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?
2. Was denkst du denn, was die Zeilen 3 und 4 tun?
-
- 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
- __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.
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.
-
- 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...
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.
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:
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.
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}
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.
-
- 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
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
@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?
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]}
@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?
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,]}
-
- 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()}
@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?
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?
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?
-
- 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__
vermutlich brauche ich hierzu eine if-Schleife?
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.
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.