2015-05-29 7 views
7

Ich gehe durch das neue Buch "Data Science from Scratch: Erste Prinzipien mit Python" und ich denke, ich habe eine Errata gefunden .TypeError: 'int' Objekt hat kein Attribut '__getitem__' Fehler wegen möglichen Erratum in Buch

Wenn ich den Code, den ich "TypeError: 'int' object has no attribute '__getitem__'". bekommen betreibe ich denke, das ist, weil, wenn ich friend["friends"] wählen versuchen, friend eine ganze Zahl ist, die ich nicht Subset kann. Ist das korrekt? Wie kann ich die Übungen so fortsetzen, dass ich die gewünschte Ausgabe bekomme? Es sollte eine Liste von Freunden von Freunden (Foaf) sein. Ich weiß, dass es Probleme Wiederholung aber die sind später festgelegt ...

users = [ 
    {"id": 0, "name": "Ashley"}, 
    {"id": 1, "name": "Ben"}, 
    {"id": 2, "name": "Conrad"}, 
    {"id": 3, "name": "Doug"}, 
    {"id": 4, "name": "Evin"}, 
    {"id": 5, "name": "Florian"}, 
    {"id": 6, "name": "Gerald"} 
] 

#create list of tuples where each tuple represents a friendships between ids 
friendships = [(0,1), (0,2), (0,5), (1,2), (1,5), (2,3), (2,5), (3,4), (4,5), (4,6)] 

#add friends key to each user 
for user in users: 
    user["friends"] = [] 

#go through friendships and add each one to the friends key in users 
for i, j in friendships: 
    users[i]["friends"].append(j) 
    users[j]["friends"].append(i) 

def friends_of_friend_ids_bad(user): 
    #foaf is friend of friend 
    return [foaf["id"] 
     for friend in user["friends"] 
     for foaf in friend["friends"]] 

print friends_of_friend_ids_bad(users[0]) 

Vollzurückverfolgungs:

Traceback (most recent call last): 
    File "/Users/marlon/Desktop/test.py", line 57, in <module> 
    print friends_of_friend_ids_bad(users[0]) 
    File "/Users/marlon/Desktop/test.py", line 55, in friends_of_friend_ids_bad 
    for foaf in friend["friends"]] 
TypeError: 'int' object has no attribute '__getitem__' 
[Finished in 0.6s with exit code 1] 
[shell_cmd: python -u "/Users/marlon/Desktop/test.py"] 
[dir: /Users/marlon/Desktop] 
[path: /usr/bin:/bin:/usr/sbin:/sbin] 

Wie ich denke, dass es behoben werden kann: Ich glaube, Sie Benutzer als zweites Argument brauchen, und dann do "für foaf Benutzer [Freund] [" Freunde "]" statt "für foaf in Freund [" Freunde "]

+0

Post voll traceback hast du – Alik

+0

@Alik Ich habe es – megashigger

+0

hinzugefügt was ist 'Freundschaften' dort? – itzMEonTV

Antwort

3

Ja, haben Sie ein falsches Stück Code in dem Buch.

Implementierung für friends_of_friend_ids_bad Funktion sollte wie folgt sein:

def friends_of_friend_ids_bad(user): 
    #foaf is friend of friend 
    return [users[foaf]["id"] 
     for friend in user["friends"] 
     for foaf in users[friend]["friends"]] 

user["friends"] ist eine Liste von ganzen Zahlen, so friend eine ganze Zahl ist und friend["friends"] erhöhen wird TypeError Ausnahme


UPD

Es scheint, dass das Problem in dem Buch nicht über friends_of_friend_ids_bad Funktion sondern überPopulation warListen. Ersetzen

for i, j in friendships: 
    users[i]["friends"].append(j) 
    users[j]["friends"].append(i) 

mit

for i, j in friendships: 
    users[i]["friends"].append(users[j]) 
    users[j]["friends"].append(users[i]) 

Dann friends_of_friend_ids_bad und friends_of_friend_ids wird wie vorgesehen.

+0

Danke, das funktioniert! Hast du das Buch auch gelesen? Es ist eine Errata dann richtig? – megashigger

+0

@Kennen Sie den richtigen Code für Freunde_der_Freund_IDs (Benutzer) auch? Der Versuch, es herauszufinden, aber Counter verwirrt mich. – megashigger

+0

@ user2469211 Nr. Ich denke, ich kann es herausfinden, aber ich muss zuerst ein paar Absätze lesen. Ich empfehle Ihnen, eine weitere Frage über 'Freunde_des_Freund_ids' – Alik

0

Der Fehler ist auf:

return [foaf["id"] for friend in user["friends"] for foaf in friend["friends"]] 

Im zweiten for-Schleife, Sie versuchen __getitem__ von users[0]["friends"] zugreifen zu können, die genau 5 (Ints haben nicht __getitem__).

Sie versuchen foaf["id"] in user["friends"] für jeden Freund auf der Liste zu speichern und für jeden foaf friend["friends"]. Das Problem ist, dass Foaf von friend["friends"] die Nummer aus einem Tupel innerhalb von Freundschaften erhält, die auf Benutzern gespeichert wurde, und dann versuchen Sie ["id"] von ihm zuzugreifen, versuchen, __getitem__ von einem Ganzzahlwert aufzurufen.

Das ist die genaue Ursache Ihres Problems.

Verwandte Themen