Ersetzen von String mit zugehörigem Dictonary key

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.
Antworten
x1334
User
Beiträge: 13
Registriert: Mittwoch 13. Juni 2012, 12:34

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
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Kannst du bitte ein vorher/nachher-Beispiel geben? Ich bin mir nicht sicher, ob du den Key meinst, der auf die gefundene Liste "verweist".
x1334
User
Beiträge: 13
Registriert: Mittwoch 13. Juni 2012, 12:34

Beispiel:

Ich habe ein File mit:

Code: Alles auswählen

laufen Krabbe
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:

Code: Alles auswählen

laufen Fisch
laufen Wirbeltier
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
x1334
User
Beiträge: 13
Registriert: Mittwoch 13. Juni 2012, 12:34

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

Code: Alles auswählen

['Krabbe']
['Krabbe']
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?!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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
x1334
User
Beiträge: 13
Registriert: Mittwoch 13. Juni 2012, 12:34

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!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten