2016-02-15 24 views
8

私はPythonには新しく、これに対する答えを見つけることができませんでした。メッセージの最後にあるコードを参照すると、以下の行の "item、totals.items()"の部分の意味は分かりますか?AttributeError: 'dict'オブジェクトには属性がありません

rankings = [(total/simSums[item], item) for item, total in totals.items()] 

また、コードが失敗し、Iが "予測(S)" コードの "アイテム(複数可)" のすべてのインスタンスを変更したとき

AttributeError: 'dict' object has no attribute 'predictors' 

を述べました。どうしてこんなことに?

# Return the Pearson correlation coefficient for p1 and p2 
def sim_person(prefs, p1, p2): 
    # Get the list of shared_items 
    si={} 
    for item in prefs[p1]: 
     if item in prefs[p2]:si[item]=1 

    # Find the number of elements 
    n=len(si) 

    # if they have no ratings in common, return 0 
    if n==0: return 0 

    # Add up all the preferences 
    sum1 = sum([prefs[p1][it] for it in si]) 
    sum2 = sum([prefs[p2][it] for it in si]) 

    # Sum up the squares 
    sum1Sq = sum([pow(prefs[p1][it],2) for it in si]) 
    sum2Sq = sum([pow(prefs[p2][it],2) for it in si]) 

    # Sum up the products 
    pSum = sum([prefs[p1][it]*prefs[p2][it] for it in si]) 

    # Calculate Person score 
    num = pSum - (sum1*sum2/n) 
    den = sqrt((sum1Sq - pow(sum1,2)/n)*(sum2Sq - pow(sum2,2)/n)) 
    if den == 0: return 0 

    r = num/den 
    return r 

# Returns the best matches for person from the prefs dictionary. 
# Number of results and similarity function are optional params. 
def topMatch(prefs, person, n=5, similarity=sim_person): 
    scores = [(similarity(prefs, person, other), other) 
       for other in prefs if other!=person] 

    # Sort the list so the highest scores appear at the top 
    scores.sort() 
    scores.reverse() 
    return scores[0:n] 

# Gets recommendations for a person by using a weighted average 
# of every other user's rankings 
def getRecommendations(prefs, person, similarity=sim_person): 
    totals = {} 
    simSums = {} 
    for other in prefs: 
     # don't compare me to myself 
     if other == person: continue 
     sim = similarity(prefs, person, other) 

     # ignore scores of zero of lower 
     if sim<=0: continue 
     for item in prefs[other]: 

      # only score movies I haven't seen yet 
      if item not in prefs[person] or prefs[person][item]==0: 
       # Similarity * Score 
       totals.setdefault(item, 0) 
       totals[item]+=prefs[other][item]*sim 
       # Sum of similarities 
       simSums.setdefault(item, 0) 
       simSums[item]+=sim 

    # Create the normalized list 
    rankings = [(total/simSums[item], item) for item, total in totals.items()] 

    # Return the sorted list 
    rankings.sort() 
    rankings.reverse() 
    return rankings 
+2

を読んで字下げは、Pythonの動作に影響を与えますので、インデントは、あなたが投稿任意のコード、特にPythonコードで適切であることを確認してください。 – khelwood

+4

私はあなたがdownvotersは初心者に少しラフだと思う。 – bgusach

+0

@bgusach:私の_guess_は、 'dict.items'がドキュメント内で見つけるのが簡単であるため、下降の問題は研究の不足によるものです。 OTOH、Pythonが最初のプログラミング言語であれば、公式のPythonのドキュメントはちょっと怖いかもしれないと思います。 –

答えて

9

dict.itemsは、辞書のキーと値のペアを反復処理します。したがって、for key, value in dictionary.items()は各ペアでループします。これは文書化された情報であり、official web pageで確認することも、さらに簡単には、Pythonコンソールを開いてhelp(dict.items)と入力することもできます。そして今、ちょうど例として:

>>> d = {'hello': 34, 'world': 2999} 
>>> for key, value in d.items(): 
... print key, value 
... 
world 2999 
hello 34 

AttributeErrorは、オブジェクトがアクセスしようとした属性を持っていないときにスローされる例外です。クラスdictにはpredictors属性がありません(これでチェックする場所はわかりました:))、アクセスしようとすると文句を言います。それと同じくらい簡単です。

常に、RTFMを覚えている:「罰金」手動:)

+0

どうもありがとうございました。私はtotals.itemsがdict.itemsを参照し、それがJSONオブジェクトのようなものであると思ったことを認識していませんでした。今私はそのような問題に今後どのように対処するかを知っています。再度、感謝します。 –

+0

お寄せいただきありがとうございます。受け入れられたものとしてマークすることを忘れないでください! – bgusach

関連する問題