Inverted Index in Python nicht die gewünschten Ergebnisse zurückgeben

Ich habe Schwierigkeiten, die richtigen Ergebnisse für einen invertierten Index in Python zurückzugeben. Ich versuche, eine Liste von Strings in die Variable 'strlist' zu laden und dann mit meinem Inverse Index Looping über die Strings, um das Wort + wo es auftritt. Hier ist was ich so weit gegangen bin:

def inverseIndex(strlist): d={} for x in range(len(strlist)): for y in strlist[x].split(): for index, word in set(enumerate([y])): if word in d: d=d.update(index) else: d._setitem_(index,word) break break break return d 

Jetzt, wenn ich inverseIndex (strlist)

  • Wie bekomme ich Indizes eines sortierten Arrays in Python
  • Python Wörterbuch Index eines Wertes
  • Ersetzen Sie df-Indexwerte mit Werten aus einer Liste, aber ignorieren Sie leere Zeichenfolgen
  • Python: Geben Sie den Index des ersten Elements einer Liste zurück, die eine übergebene Funktion true macht
  • Indexierung einer verschachtelten Liste
  • Abfrage von MultiIndex-Indexspalten in Pandas
  • Alles, was es zurückgibt, ist {0:'This'} wo was ich will, ist ein Wörterbuch, das alle Wörter in 'strlist' auf das Set d 'strlist' .

    Ist mein erster Ansatz falsch? Bin ich stolperte in der if / else? Jede und alle Hilfe wird sehr geschätzt. Um mich in die richtige Richtung zu stellen.

  • Pythonische Möglichkeit, Komma getrennte Zahlen in Paare zu teilen
  • Konvertieren einer Liste von Ints, Tupel in ein numpy Array
  • Tupel mit kleinstem y-Wert aus der Liste der Tupel zurückgeben
  • Extrahieren Sie verschiedene Werte aus der Liste der Tupel
  • Warum kann ich nicht in dieses Tupel in Python?
  • Python: So entfernen Sie das letzte Komma aus Tupeln
  • 2 Solutions collect form web for “Inverted Index in Python nicht die gewünschten Ergebnisse zurückgeben”

    Basierend auf dem, was du sagst, denke ich, dass du versuchst, einige Daten wie folgt zu bekommen:

     input = ["hello world", "foo bar", "red cat"] data_wanted = { "foo" : 1, "hello" : 0, "cat" : 2, "world" : 0, "red" : 2 "bar" : 1 } 

    Also, was Sie tun sollten, ist das Hinzufügen der Wörter als Schlüssel zu einem Wörterbuch, und haben ihre Werte der Index des Teilstrings in strlist in dem sie sich befinden.

     def locateWords(strlist): d = {} for i, substr in enumerate(strlist): # gives you the index and the item itself for word in substr.split() d[word] = i return d 

    Wenn das Wort in mehr als einem String in strlist , sollten Sie den Code wie folgt ändern:

     def locateWords(strlist): d = {} for i, substr in enumerate(strlist): for word in substr.split() if word not in d: d[word] = [i] else: d[word].append(i) return d 

    Dies ändert die Werte zu Listen, die die Indizes der Teilstrings in der strlist enthalten, die dieses Wort enthalten.

    Einige der Probleme deines Codes wurden erklärt

    1. {} Ist kein Satz, es ist ein Wörterbuch.
    2. break eine Schleife, um sofort zu beenden – du wolltest die Schleife nicht früher beenden, weil du noch Daten verarbeitet hast.
    3. d.update(index) gibt dir ein TypeError: 'int' object is not iterable . Diese Methode nimmt tatsächlich ein iterierbares Objekt und aktualisiert das Wörterbuch mit ihm. Normalerweise würdest du hier eine Liste von Tupeln verwenden: [("foo",1), ("hello",0)] . Es fügt einfach die Daten zum Wörterbuch hinzu.
    4. Du willst normalerweise nicht d.__setitem__ (was du sowieso falsch eingegeben hast). Sie verwenden einfach d[key] = value .
    5. Sie können iterieren mit einem "für jeden" Stil Loop statt, wie mein Code oben zeigt. Schleifen über den Bereich bedeutet, dass Sie über die Indizes schleifen. (Nicht genau ein Problem, aber es könnte zu zusätzlichen Bugs führen, wenn Sie nicht vorsichtig sind, die Indizes richtig zu benutzen).

    Es sieht so aus, als wärst du aus einer anderen Programmiersprache, in der Klammern Sätze angeben, und es gibt ein Schlüsselwort, das die Kontrollblöcke beendet (wie if, fi ). Es ist einfach, Syntax zu verwechseln, wenn du zum ersten Mal anfängst – aber wenn du in Schwierigkeiten beim Ausführen des Codes gehst, schau dir die Ausnahmen an, die du bekommst und sie im Internet durchsuchst!

    PS Ich bin mir nicht sicher, warum du einen Satz wünschst – wenn es Duplikate gibt, dann möchtest du wahrscheinlich alle ihre Orte kennen, nicht nur die erste oder die letzte oder irgendetwas dazwischen. Nur meine $ 0,02.

    break ist kein End-of-Block-Marker; Es bedeutet "wenn du diese Codezeile schlägst, beende die Schleife sofort". Sie wollen wahrscheinlich nicht alle diese Aussagen.

    Ich bin mir nicht sicher, was Sie denken, dass die update Methode funktioniert.

     d.update(index) 

    Wird versuchen, index als dict oder eine Sequenz von Key-Value-Paaren zu behandeln und fügen Sie alle Mappings in index zu d . Da index eine Zahl ist, scheint dies nicht zu sein, was Sie erwarten, dass update zu tun ist. Auch update gibt None , was das Python-Äquivalent ist, um nichts zurückzugeben, also vermutlich willst du seinen Wert nicht d .

    Ich bin nicht sicher, was Sie erwarten

     for index, word in set(enumerate([y])): 

    tun. Lass uns gehen, was es tut [y] erstellt eine 1-Element-Liste, deren einziges Element y . enumerate([y]) gibt dann einen Iterator zurück, der ein einzelnes Element ergibt, das Tupel (0, y) . set(enumerate([y])) nimmt dann alle Items aus diesem Iterator (also nur ein Item) und mache einen Satz mit diesen Items. Schließlich wird for index, word in set(enumerate([y])): über diesen Ein-Item-Set iterieren, eine Single-Loop-Iteration mit index == 0 und word == y ausführen. Das ist wahrscheinlich nicht das, was du versucht hast zu tun.

    Die __setitem__ Spezialmethode (die auf beiden Seiten zwei Unterstriche hat) wird von Python zur Implementierung der Elementzuweisung aufgerufen.

     d.__setitem__(index, word) 

    Ist besser geschrieben als

     d[index] = word 

    Wenn du über strlist iterieren strlist , dann kannst du statt der range(len(strlist)) über strlist direkt iterieren

      for x in range(len(strlist)): for y in strlist[x].split(): 

    ist äquivalent zu

      for string in strlist: for y in string.split(): 

    Da Looping über Strlist wird die Elemente der Strlist geben.

    Ich hoffe das hilft.

    Python ist die beste Programmiersprache der Welt.