简体   繁体   English

AttributeError: 'dict' 对象没有属性 'predictors'

[英]AttributeError: 'dict' object has no attribute 'predictors'

I am new to python and couldn't find the answer to this.我是 python 新手,找不到答案。 Referring to the code at the end of the message, can I know what does the part "for item, total in totals.items()" in the line below mean?参考消息末尾的代码,我能知道下一行中的“for item, total in totals.items()”部分是什么意思吗?

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

Also, the code failed and said另外,代码失败并说

AttributeError: 'dict' object has no attribute 'predictors' AttributeError: 'dict' 对象没有属性 'predictors'

when I changed all instances of "item(s)" in the code to "predictor(s)".当我将代码中“item(s)”的所有实例更改为“predictor(s)”时。 Why is that so?为什么呢?

# 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

The dict.items iterates over the key-value pairs of a dictionary. dict.items迭代字典的键值对。 Therefore for key, value in dictionary.items() will loop over each pair.因此, for key, value in dictionary.items()将遍历每一对。 This is documented information and you can check it out in the official web page , or even easier, open a python console and type help(dict.items) .这是文档信息,您可以在官方网页中查看,或者更简单,打开 python 控制台并键入help(dict.items) And now, just as an example:现在,举个例子:

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

The AttributeError is an exception thrown when an object does not have the attribute you tried to access. AttributeError是当对象不具有您尝试访问的属性时抛出的异常。 The class dict does not have any predictors attribute (now you know where to check it :) ), and therefore it complains when you try to access it.dict没有任何predictors属性(现在您知道在哪里检查它:)),因此当您尝试访问它时它会抱怨。 As easy as that.就这么简单。

#Try without dot notation sample_dict = {'name': 'John', 'age': 29} print(sample_dict['name']) # John print(sample_dict['age']) # 29
product_details = {
'name':'mobile',
'company':'samsung'}

accessing product_details.name will throw the error "dict object has no attribute 'name' " .访问 product_details.name 将抛出错误“dict object has no attribute 'name'”。 reason is because we are using dot (.) to access dict item.原因是因为我们使用点 (.) 来访问 dict 项目。

right way is :
product_details['name']  

we use dot operator to access values from objects in python.我们使用点运算符从 python 中的对象访问值。

the dictionary.items() allows us to loop through key:value pairs in the dictionary dictionary.items() 允许我们遍历字典中的键:值对

for key, value in product_details.items(): 
    print(key,':',value)

for each iteration of the loop a key and its value is assigned to the variables key and value here.对于循环的每次迭代,一个键和它的值被分配给这里的变量键和值。 this is how items() method works.这就是 items() 方法的工作原理。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM