2017-06-08 5 views
0

Ich versuche, den Fehler in meinem Code zu finden. Meine IDE (Coderunner auf Mac) nur sagt dies:Python-Ausnahme: ValueError: zu viele Werte zum Entpacken (erwartet 2)

File "A3.py", line 27, in <module> 
ValueError: too many values to unpack (expected 2) 

ich nie diese Ausnahme hatte. Ich weiß nicht, wie ich damit umgehen soll und wo das Problem liegt. Was mache ich falsch?

Dies ist mein Code ... Ich Linie

with open("spd.txt", encoding="utf-8") as f: 
    text = f.read() 
text = text.replace("\xad", "") 

words = [] 
for word in text.lower().split(): 
    word = word.strip("‚‘!,.:«»-()'_#-–„“■;+*?") 
    if word != "": 
     if not word[-1].isalnum(): 
      print(repr(word)) 
     words.append(word) 


trigrams = {} 
for i in range(len(words)-2): 
     word = words[i] 
     nextword = words[i + 1] 
     nextnextword = words[i + 2] 
     key = (word, nextword, nextnextword) 
     trigrams[key] = trigrams.get(key, 0) + 1 


l = list(trigrams.items()) 
l.sort(key=lambda x: (x[1], x[0])) 
l.reverse() 

for key, count in trigrams: #This is line 27 
    if count < 5: 
     break 
    word = key[0] 
    nextword = key[1] 
    nextnextword = key[2] 
    print(word, nextword, nextnextword, count) 
+5

Sie müssen 'für Schlüssel zu tun, in trigrams.items zählen():'. iterieren über die Tasten _und_ die Werte zusammen. Iterieren nur über das Wörterbuch gibt nur die Schlüssel. –

Antwort

0

Sie benötigen 27. kommentiert for key, count in trigrams.items(): zu tun über die Tasten iterieren und die gemeinsam Werte. Iterieren nur über das Wörterbuch gibt nur die Schlüssel.

0

Wenn Ihr

tun
for key, count in trigrams: 
    # do stuff 

ist es gleichbedeutend mit:

it = iter(trigrams) 
while True: 
    try: 
     key, count = it.__next__() 
     # do stuff 
    except StopIteration: 
     break 

Dies ist, was Python hinter den Kulissen tut, wenn Sie über einen iterable laufen. Wie Sie anhand des obigen Codes sehen können, wird ein Funktionsaufruf an die __next__()-Methode des Iterators trigrams durchgeführt, wenn trigrams iteriert wird. Die __next__() Funktion gibt nur die nächste Schlüssel im Wörterbuch jedoch zurück. zB:

>>> d = {'a': 1, 'b': 2} 
>>> iter(d).__next__() 
'a' 
>>> 

Also, wenn Sie versuchen, den Rückgabewert von iter(trigrams).__next__(), Python löst einen Fehler zu entpacken, da nur einem Wert zurückgegeben wird, nicht zwei. zB:

>>> d = {'a': 1, 'b': 2} 
>>> a, b = iter(d).__next__() 
Traceback (most recent call last): 
    File "<pyshell#17>", line 1, in <module> 
    a, b = iter(d).__next__() 
ValueError: not enough values to unpack (expected 2, got 1) 
>>> 

Um dies zu beheben, müssen Sie die dict.items() Methode verwenden, um ein Tupel zurück, die einen Schlüssel enthält, Wertepaar, die Sie dann auspacken können. From the documentation on .items():

Return a new view of the dictionary’s items ((key, value) pairs). See the documentation of view objects.

for key, count in trigrams.items(): # Use the .items() method 
    if count < 5: 
     break 
    word = key[0] 
    nextword = key[1] 
    nextnextword = key[2] 
    print(word, nextword, nextnextword, count) 
Verwandte Themen