Wörter aus Liste einem Key aud Dictionary zuordnen

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
marena
User
Beiträge: 15
Registriert: Dienstag 22. März 2016, 10:35

Hallo!
ich habe ein Lexikon "lex". Ich möchte prüfen, ob Wörter, die in der Liste "words" stehen einen Kex in "Lex" haben.
ich habe hier schon einmal "words" mit der Funktion Counter in Verbindung, da ich die Vorkommen von Counter in words auch zählen möchte.

Mit den For-Schleifen unten möchte ich prüfen, ob i (also das jeweilige Wort) in den Values von "lex", also(kateg) ist. Und das im allerletzen Schritt ausgeben lassen.

Code: Alles auswählen

for jedes, kateg in lex.items():
    for i,k in Counter(words).items():
        if i in kateg:
            print(i)
            print (jedes[[kateg][i]])

Leider wird mir dort immer folgender Fehler angezeigt: list indices must be integers, not str

Wie kann ich das lösen? Kann man das irgendwie anders audrücken, als mit meiner Formulierung in der letzten Zeile??

Wäre euch wirklich super dankbar!
marena
User
Beiträge: 15
Registriert: Dienstag 22. März 2016, 10:35

okay, Lösung nach tausend mal hin und her^^:

Code: Alles auswählen

list_of_keys = lexicon.keys() 
#for k in list_of_keys:
 #   print(str(k) + ":" + str(lexicon[k]))  
for teil in lexicon.values():
    #print(teil)
    for t in teil:
        for element in wort:
            if element == t:
                new.append(t)
                for k in list_of_keys:
                    if t in str(lexicon[k]):
                        print(k,t)
from collections import Counter
Counter(new)

die variablen haben sich mit der Zeit umbenannt^^...aber man sieht ja was passiert, oder?-....LG
BlackJack

@marena: Die Variablen sind vor allem schlecht benannt und eine Zeichenkette auf vorhandensein in der Zeichenkettendarstellung einer Liste zu testen ist gruselig kaputt.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@marena: die Datenstruktur sieht falsch aus. Woher kommt eigentlich lexicon? Eigentlich willst Du es ja umgedreht haben, dass die Values von lexicon Keys und die Keys Values sind:

Code: Alles auswählen

# Umdrehen des Woerterbuchs
reverse_lexicon = defaultdict(list)
for key, words in lexicon.items():
    for word in words:
        reverse_lexicon[word].append(key)
Dann sparst Du Dir die hälfte der for-Schleifen und der Code wird klarer, was der eigentlich macht:

Code: Alles auswählen

for element in wort:
    if element in reverse_lexicon:
        new.append(element)
        for key in reverse_lexicon[element]:
            print(key, element)
marena
User
Beiträge: 15
Registriert: Dienstag 22. März 2016, 10:35

Hey! Vielen vielen Dank für die Verbesserung! Leider bekomme ich mein Probelm dadurch leider noch nicht so richtig gelöst :/...
Ich möchte eig nur, dass dann hinter
paeuschen: 1 "pause" steht
und hinter
stunden: 1 "zeit"

also eigentlich nur, dass nach jedem gezählten Synonym das "Grundwort" angezeigt wird. ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Woran scheiterst Du denn noch? Zeig doch mal Deinen Code!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
marena
User
Beiträge: 15
Registriert: Dienstag 22. März 2016, 10:35

Hey! Wie schon oben beschrieben möchte ich gerne eine Ausge in folgender Form erzeugen:

paeuschen: 1 pause

...bisher schaffe ich es aber immer nur separat von einander folgende ausgaben zu bekommen:
paeuschen:1
paeschen , pause
...und hier jetzt der Code, an dem ich schon die ganze zeit rumwerke :/

Code: Alles auswählen

lexicon={"pause":("pause","break","paeuschen", "intermezzo", "ruhephase"),

"arbeiten":("arbeiten","taetig", "malochen", "lernen"),
"zeit":("zeit","stunden","tag")}
text= "ich muss ertmal eine kleine ruhephase tag machen am tag, nach stunden pause. ich war den ganzen tag arbeiten und lernen, ein kleines paeuschen tut da schon gut, ich hatte naemlich heute gar keine pause, ich war nur arbeiten."

wort=re.findall(r'(\w+)',str(text))
syn=[]
probe={}
ja=[]
list_of_keys = lexicon.keys() 
for teil in lexicon.values():
    for t in teil:
        for element in wort:
            if element == t:
                syn.append(t)
                for k in list_of_keys:
                    if t in str(lexicon[k]):
                        ja.append(t)

print(ja)

from collections import Counter
hier=(Counter(syn))
#print(hier)


# Umdrehen des Woerterbuchs
from collections import defaultdict
reverse_lexicon = defaultdict(list)
for key, words in lexicon.items():
    for word in words:
        reverse_lexicon[word].append(key)
print(reverse_lexicon)

from collections import Counter
new={}
#print(wort)
#or var in reverse_lexicon:
 #  if var in wort:
for var in wort:
    if var in reverse_lexicon:
        #print(element)
        #new.append(var)
        
        #print(reverse_lexicon[var])
        new[var]=reverse_lexicon[var]
print(new)

#Counter(new):

#for i in Counter(new):
 #   for e in reverse_lexicon:
  #  print(i)


entschuldigt, dass es ein bisschen chaotisch aussieht, aber wie gesagt, ich fummel da schon eine Weile rum und komme dem Ziel einfach nicht näher :/

Würd mich freuen, wenn ihr euch das nochmal anschauen könntet...LG
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@marena: das Chaos in Deinem Code behindert Dich selbst beim Finden der richtigen Lösung, daher immer sauberen Code schreiben. Imports sollten immer ganz oben stehen. re wird gar nicht importiert. Die Werte von lexicon sollten Listen und keine Tuple sein. wort sollte eigentlich woerter oder words heißen, da es ja viele Wörter enthält. str auf einen String aufzurufen ist unsinnig. Dann willst Du die Anzahl der Wörter zählen und alles danach ausgeben:

Code: Alles auswählen

import re
from collections import Counter, defaultdict
lexicon={
    "pause": ["pause","break","paeuschen", "intermezzo", "ruhephase"],
    "arbeiten": ["arbeiten","taetig", "malochen", "lernen"],
    "zeit": ["zeit","stunden","tag"]
}

# Umdrehen des Woerterbuchs
reverse_lexicon = defaultdict(list)
for key, words in lexicon.items():
    for word in words:
        reverse_lexicon[word].append(key)

text = "ich muss ertmal eine kleine ruhephase tag machen am tag, nach stunden pause. ich war den ganzen tag arbeiten und lernen, ein kleines paeuschen tut da schon gut, ich hatte naemlich heute gar keine pause, ich war nur arbeiten."
words = Counter(re.findall(r'(\w+)', text))

for word, count in words.items():
    print word, count, reverse_lexicon.get(word, '??')
marena
User
Beiträge: 15
Registriert: Dienstag 22. März 2016, 10:35

Das ist super gut! Vielen vielen Dank! Ich fürchte ich wäre nie darauf gekommen!...gibt es jetzt nur noch eine Methode, mit der ich die Fälle mit "??" einfach löschen kann??^^...Sorry, aber dann wäre ich überglücklich ...
marena
User
Beiträge: 15
Registriert: Dienstag 22. März 2016, 10:35

Ah, ich habs!!!! :)))))))

Code: Alles auswählen

for word, count in words.items():
    if word in reverse_lexicon:
        print word, count, reverse_lexicon.get(word)
Das passt doch, oder??^^

ich bin euch so unglaublich dankbar!!! Ich würd euch ja gern mal auf nen Kaffee einladen ^^...
Antworten