Für jeden Key eines Dictionarys eine Liste erstellen

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
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Hallo!

Ich habe vorhin schon einen ähnlichen Post gemacht. Bin aber leider noch nicht weiter gekommen. Ich versuche es daher nochmal. Tut mir leid, falls ich euch nerven sollte und es für euch trivial ist^^...Für mich ist es das leider nicht :/...Daher würde ich mich über Hilfe sehr freuen!

Also ich möchte gerne, das für jeden Key in 'lexikon' geprüft wird, ob er in 'basis' enthalten ist. Wenn ja, möchte ich gerne, dass für jeden Key der vorkommt eine Liste erstellt wird. In dieser Liste sollen dann die jeweiligen Elemente stehen, die in basis von dem Key realisiert sind.
Mit dem Code der unten steht, funktioniert meine Idee nur soweit, dass ich eine Liste habe, in der alle diese Vorkommen von den jeweiligen Keys stehen. Also eine große Liste für alle Keys anstatt jeweils eine Liste pro in basis realisiertem Key.

Weiß denn niemand, wie man das Prroblem lösen könnte?? :(

Code: Alles auswählen


lexikon={'du':'5', 'morgen':'2', ''Woche':'10','und':'20', 'wir':'2','du':'1','ruhen':'3', 'Sonne':'5', 'Mond':'4','Sterne':'3'}
basis=['hallo du','hallo ich','hallo sie','wir gehen','wir schlafen','wir ruhen','du guckst','du gehst','wie heute','wie morgen']
c=Counter()
basis1=[]
for key in lexikon.keys():
    for i in basis:
        if key in i:
            basis1.append(i)
    for element in basis1:
        c=Counter()
    c.update(neu_list)
    print(c)
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Die Beschreibung klingt etwas wirr, aber hier mal ein Aufschlag:

Code: Alles auswählen

#!/usr/bin/env python3
    
def main():
    lexikon = {
        'du': 3, 'morgen': 2, 'Woche': 10, 'und': 20, 'wir': 2,
        'ruhen': 3, 'Sonne': 5, 'Mond': 4,'Sterne': 3
        # Zweites Vorkommen des key 'du' entfernt
    }
    basis = [
        'hallo du', 'hallo ich', 'hallo sie', 'wir gehen', 'wir schlafen',
        'wir ruhen', 'du guckst', 'du gehst', 'wie heute', 'wie morgen'
    ]
    
    result = {k: [e for e in basis if k in e] for k in lexikon.keys()}
    print(result)
    
if __name__ == '__main__':
    main()
Ausgabe:

Code: Alles auswählen

{'wir': ['wir gehen', 'wir schlafen', 'wir ruhen'], 'und': [], 'ruhen': ['wir ruhen'], 'du': ['hallo du', 'du guckst', 'du gehst'], 'Sonne': [], 'Mond': [], 'Woche': [], 'Sterne': [], 'morgen': ['wie morgen']}
Die Sache hat nur einen gewaltigen Haken :wink: ... ich geh duschen.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Hallo! Vielen Dank für deine Antwort!
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Eine Frage hätte ich noch, in meinem kompletten Korpus kommen einige Wortfolgen mehrmals vor. Wie kann ich nun die Anzahl der jeweiligen Wortfolge wieder dahinter stehen lassen? Das war ja vorher so, fällt jetzt aber leider weg. Also das jeder Wortfolge nur einmal in der Liste aufgezeigt wird, mit der Anzahle ihrer Vorkommen....?
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Definiere doch bitte die Begriffe "Korpus" und "Wortfolge" bzw. gebe eine Beispieleingabe und das von Dir erwartete Ergebnis vor. Dies bitte formal (eindeutig, z. B. als (Pseudo-)Code) und nicht verbal.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Hallo!
Also mit meinem Korpus meine ich nur, das Textmaterial, mit dem ich arbeite...leider zu groß, um es hier reinzukopieren.
Mein Probelm ist jetzt quasi nur noch, dass manche Einträge in "basis" doppelt sind, wie bspw. "wir gehen". (s. im veränderten Code unten)

Code: Alles auswählen

#!/usr/bin/env python3
   
def main():
    lexikon = {
        'du': 3, 'morgen': 2, 'Woche': 10, 'und': 20, 'wir': 2,
        'ruhen': 3, 'Sonne': 5, 'Mond': 4,'Sterne': 3
        # Zweites Vorkommen des key 'du' entfernt
    }
    basis = [
        'hallo du', 'hallo ich','hallo du', 'hallo sie', 'wir gehen', 'hallo sie','wir schlafen',
        'wir ruhen','wir gehen', 'du guckst', 'du gehst', 'wir gehen', 'wie heute', 'wie morgen'
    ]
   
    result = {k: [e for e in basis if k in e] for k in lexikon.keys()}
    print(result)
   
if __name__ == '__main__':
    main()

Ich hätte jetzt nur gerne, dass in der Ausgabe zu jedem eintrag in "basis" die Zahl zurgeordnet ist, wie oft dieser Eintrag vorkommt. Also quasi ein Dictionary, bei dem dann stehen würde:
'wir':['wir gehen':3, 'wir schlafen':1,'wir ruhen':1]

Bisher sieht es ja noch so aus:

Code: Alles auswählen

{'Mond': [], 'morgen': ['wie morgen'], 'und': [], 'wir': ['wir gehen', 'wir schlafen', 'wir ruhen', 'wir gehen', 'wir gehen'], 'ruhen': ['wir ruhen'], 'du': ['hallo du', 'hallo du', 'du guckst', 'du gehst'], 'Woche': [], 'Sonne': [], 'Sterne': []}
Danke für deine Antworten!
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

@Noranora:
Hast du dir mal collections.Counter angesehen?
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

BlackJack hat geschrieben:@nezzcarth: Jup: viewtopic.php?f=1&t=38265
Oh, 'tschuldigung. Den Thread hatte ich nicht gesehen :(

Heißt das nun, dass Counter hier nicht das richtige sind (dann habe ich die Frage falsch verstanden), oder dass der Umgang mit Countern noch nicht verstanden ist?
BlackJack

@nezzcarth: Da wartet vielleicht jemand, das jemand anders endlich den Quelltext schreibt. Am Ende müsste sonst selbst jemand Python lernen und nachdenken. :twisted:

Die Lösung mit `Counter` in Hy habe ich ja schon geschrieben. Das ist letztendlich das gleiche Programm in Lisp-Form was man in Python schreiben würde. Ich war mir halt zu schade eine direkte Lösung in Python zu schreiben. :-)
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Ich fürchte der Umgang ist noch nicht recht verstanden. Einfach möchte ich es mir hier wirklich nicht machen! Ich versuche nur meine Probleme zu lösen. Es tut mir leid, wenn ich euch damit belästige!
Antworten