2017-12-20 1 views
0

Wie verwende ich .setdefault mit dem Standardwert, der eine Liste ist, die ich in einer Funktion ausgefüllt habe? Beispiel:.setdefault mit Liste gefüllt mit Funktion

import random 
foundwords = [] 

with open("text", "r") as file: 
    contents = file.read().replace('\n',' ') 
words = contents.split(' ') 

def findwords(word): 
    for i in range(len(words) - 1): 
     if words[i] == word: 
      if not words[i + 1] == '': 
       foundwords.append(words[i + 1]) 

wordsDict = {} 
for i in range(len(words) - 1): 
    findwords(words[i]) 
    wordsDict.setdefault(words[i], foundwords) 
    del foundwords[:] 

def assemble(): 
    start = words[random.randint(0, len(words))] 
    print(start.capitalize()) 



assemble() 

Wenn ich wordsDict überprüfe, sind alle Listen leer. Allerdings weiß ich, dass die Listen gefüllt sind.

+0

Was hat die 'assemble()' Funktion mit diesem Problem zu tun? – Barmar

Antwort

1

Sie erstellen keine Kopie der foundwords Liste, wenn Sie .setdefault() verwenden, so dass alle Wörterbuchelemente auf dieselbe Liste verweisen. Dann entfernen Sie alle Elemente dieser Liste mit del foundwords[:], so dass sie alle auf diese leere Liste verweisen.

Erstellen Sie eine Kopie der Liste, wenn Sie sie dem Wörterbuch hinzufügen.

for word in words: 
    findwords(word) 
    wordsDict.setdefault(word, foundwords[:]) 
    del foundwords[:] 

Besser wäre findwords() so zu ändern, eine neue Liste zurück, anstatt in eine globale Variable zu schreiben.

def findwords(word): 
    foundwords = [] 
    for i in range(len(words) - 1): 
     if words[i] == word: 
      if not words[i + 1] == '': 
       foundwords.append(words[i + 1]) 
    return foundwords 

for words in words: 
    wordsDict.setdefault(word, findwords(word)) 
+0

IMHO beide Wege sind nicht optimal, da die Funktion aufgerufen wird oder die Liste kopiert wird, auch wenn der Wert _is_ im dict ist. Verwenden Sie besser nicht 'setdefault', sondern stattdessen ein einfaches' if'. –

Verwandte Themen