Seite 1 von 1
Ersetzen von String mit zugehörigem Dictonary key
Verfasst: Montag 7. Januar 2013, 13:31
von x1334
Hallo,
habe mal wieder ein Problem mit dictonaries...
Ich habe mir ein dictonary erstellt, das so aufgebaut ist:
Code: Alles auswählen
{'Fisch': ['Kabeljau', 'Krabbe'], 'Dummkopf': ['Mist'], 'Papa': ['Hallo'], 'Wirbeltier': ['Krabbe']}
Die Listen im value des jeweiliges Keys sind dabei beliebig lang.
Nun möchte ich in allen Values nach einem Wort suchen (zB Krabbe) und falls es gefunden wurde mit dem zugehörigen key ersetzen.
Leider weiß ich nicht wie ich nach dem String in der Liste suchen kann!
Danke,
Gruß x1234
Re: Ersetzen von String mit zugehörigem Dictonary key
Verfasst: Montag 7. Januar 2013, 13:34
von sparrow
Kannst du bitte ein vorher/nachher-Beispiel geben? Ich bin mir nicht sicher, ob du den Key meinst, der auf die gefundene Liste "verweist".
Re: Ersetzen von String mit zugehörigem Dictonary key
Verfasst: Montag 7. Januar 2013, 13:43
von x1334
Beispiel:
Ich habe ein File mit:
dann will ich in meinen dictonary nach Krabbe suchen und falls das gefunden wird, möchte ich den zugehörigen key bzw. Keys (Fisch,Wirbeltier) dazu bekommen und in mein File schreiben:
Re: Ersetzen von String mit zugehörigem Dictonary key
Verfasst: Montag 7. Januar 2013, 13:52
von EyDu
Hallo.
Das solltest du eigentlich lösen können, wenn du eins der grundlegenden Tutorials durchgarbeitet hast. Wie sieht den dein momentaner Lösungsansatz aus? Den kann man sicher erweitern und dann verbessern.
Re: Ersetzen von String mit zugehörigem Dictonary key
Verfasst: Montag 7. Januar 2013, 13:58
von x1334
Code: Alles auswählen
for line in einlesen:
verb,nomen,freq = line.split()
nomenlist = [nomen]
if nomenlist in d.values():
print nomenlist
Wenn ich also Krabbe als Nomen habe, bekomme ich
Funktioniert auch wunderbar, leider weiß ich nun aber nicht, wie ich den zugehörigen Key bekommen soll.
Entweder bin ich zu blöd (wahrscheinlich) oder es gibt keinen Befehl dafür?!
Re: Ersetzen von String mit zugehörigem Dictonary key
Verfasst: Montag 7. Januar 2013, 14:01
von cofi
Fuer deinen Code: Du willst `d.items()` (oder `d.iteritems()`) statt `d.values()` benutzen.
Generell: Du willst entweder eine andere Datenstruktur benutzen oder Werte und Schluessel umdrehen, sodass "Krabbe" der Schluessel fuer `["Fisch", "Wirbeltier"]` ist.
Re: Ersetzen von String mit zugehörigem Dictonary key
Verfasst: Montag 7. Januar 2013, 14:05
von BlackJack
@x1334: Das heisst also eigentlich möchtest Du eine andere Datenstruktur, nämlich das bisherige Wörterbuch „umgedreht”. Denn einen „Befehl” gibt es nicht für das was Du möchtest, und zumindest wenn das mehr als einmal passieren soll, ist das durchsuchen der Werte ineffizient.
So wie Du das machst ist das auch nicht ausreichend, denn in den `values` können ja Listen mit mehreren Werten sein, da wirst Du so natürlich mit Deiner `nomenlist` nicht weiter kommen. Du musst alle Schlüssel/Wert-Paare des Wörterbuchs durchgehen (`iteritems()`) und das Nomen im Wert suchen.
Re: Ersetzen von String mit zugehörigem Dictonary key
Verfasst: Montag 7. Januar 2013, 14:05
von /me
x1334 hat geschrieben:Nun möchte ich in allen Values nach einem Wort suchen (zB Krabbe) und falls es gefunden wurde mit dem zugehörigen key ersetzen.
In dem Fall ist deine Struktur falsch aufgebaut. Die Schlüssel sollten Werte sein und umgekehrt. Es ist einfach nicht sinnvoll, für jeden Ersetzungsvorgang aufwändig alles zu durchsuchen wenn du das mit einem geeigneten Aufbau viel leichter und schneller haben kannst.
Es ist aber zum Glück recht einfach, die Struktur umzudrehen.
Code: Alles auswählen
from collections import defaultdict
data = {'Fisch': ['Kabeljau', 'Krabbe'], 'Dummkopf': ['Mist'], 'Papa': ['Hallo'], 'Wirbeltier': ['Krabbe']}
reversed_data = defaultdict(list)
for key, value in data.iteritems():
for element in value:
reversed_data[element].append(key)
print reversed_data
Re: Ersetzen von String mit zugehörigem Dictonary key
Verfasst: Montag 7. Januar 2013, 15:22
von x1334
Danke vielmals,
ich habe die Struktur extra so gewählt, da ich oft doppelte Einträge (wie Krabbe) hatte und das dic damit nicht vollständig war. Durch das reversen ist es nun perfekt!
Re: Ersetzen von String mit zugehörigem Dictonary key
Verfasst: Montag 7. Januar 2013, 18:56
von Hyperion
Wie immer der Hinweis am Rande bei Serialisierungen / Persitenz: Verwende doch ein Standardformat a la JSON, XML, YAML, usw. Dafür gibt es fertige Libs für Python, die meisten sogar in der Standard-Lib. Das erspart viel Arbeit beim Parsen.