Ich habe dieses Wörterbuch definiert durch:
def train(features):
model = collections.defaultdict(lambda: 1)
for f in features:
model[f] += 1
return model
Später möchte ich Pickle verwenden und das Wörterbuch in eine Textdatei kopieren:
f = open("dict.txt", "wb")
pickle.dump(Nwords, f)
Der Code funktioniert jedoch nicht und ich erhalte eine Fehlermeldung. Anscheinend pickle
kann nicht funktionieren lambda
und ich bin besser dran, das zu definieren model
mit einer Funktion auf Modulebene. Ich habe die Antworten bereits gelesen Hier
Da ich mit Python nicht vertraut bin, weiß ich leider nicht genau, wie ich das machen soll. Ich habe es versucht:
def dd():
return defaultdict(int)
def train(features):
## model = defaultdict(lambda: 1)
model = defaultdict(dd)
for f in features:
model[f] += 1
return model
Ich erhalte den Fehler:
TypeError: unsupported operand type(s) for +=: "collections.defaultdict" and "int"
Abgesehen davon, return defaultdict(int)
würde dem ersten Vorkommen eines Schlüssels immer eine Null zuweisen, wohingegen ich möchte, dass er 1 zugewiesen wird
Antworten:
2 für die Antwort № 1Leider ist diese Antwort dort richtigdiese Frage, aber subtil falsch für Sie. Eine Top-Level-Funktion anstelle eines Lambda ist zwar großartig und würde Pickle tatsächlich viel glücklicher machen, die Funktion sollte jedoch den zu verwendenden Standardwert zurückgeben, der für Ihren Fall gilt nicht Ein weiterer defaultdict
Objekt.
Gib einfach den gleichen Wert zurück lambda
kehrt zurück:
def dd():
return 1
Jedes Mal, wenn Sie versuchen, auf einen Schlüssel im zuzugreifen defaultdict
Instanz, die noch nicht existiert, dd
wird genannt. Der andere Beitrag kehrt dann zurück Ein weiterer defaultdict
Zum Beispiel dieses Set zur Verwendung int
als Standardwert, der mit dem in der anderen Frage angezeigten Lambda übereinstimmt.