2017-06-08 25 views
0

私のコードで間違いを見つけようとしています。 私のIDE(MacのCoderunnerが)これだけは言う:Python例外:ValueError:アンパックする値が多すぎます(予想2)

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

私はこの例外を持っていませんでした。私はそれを扱う方法と問題がどこにあるか分かりません。私が間違っていることは何ですか?

これは私のコードです...私はあなたが一緒にキー値を反復処理するfor key, count in trigrams.items():を行う必要がある線27

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

:'。キーと値を一緒に反復処理します。辞書のちょうど上を反復すると、キーが得られます。 –

答えて

0

をコメントしました。辞書のちょうど上を反復すると、キーが得られます。これは、あなたが反復可能を反復するとき、Pythonが舞台裏で何をするかである

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

:あなたは

for key, count in trigrams: 
    # do stuff 

を行うと

0

は、同等です。上記のコードからわかるように、trigramsを反復すると、trigrams辞書のイテレータの__next__()メソッドへの関数呼び出しが行われます。 __next__()関数は、次のキーを辞書に返します。例えば:

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

あなたがiter(trigrams).__next__()の戻り値を解凍しようとしたときにのみ値が返されるためので、Pythonはない2、エラーが発生します。例えば:

>>> 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) 
>>> 

はこれを修正するには、あなたが、その後解凍することができ、キー、値のペアが含まれているタプルを返すようにdict.items()メソッドを使用する必要があります。 From the documentation on .items()

あなたは、キーの `行うtrigrams.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) 
関連する問題