TypeError:'int'对象没有属性'__getitem__'错误,因为书中可能存在错误

meg*_*ger 7 python

我正在阅读新书"从头开始数据科学:Python的第一原理",我想我已经找到了一个勘误表.

当我运行代码时,我"TypeError: 'int' object has no attribute '__getitem__'".认为这是因为当我尝试选择时friend["friends"],friend是一个我无法子集的整数.那是对的吗?如何继续练习以获得所需的输出?它应该是朋友的朋友名单(foaf).我知道有重复问题,但后来修复了......

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])
Run Code Online (Sandbox Code Playgroud)

完全追溯:

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]
Run Code Online (Sandbox Code Playgroud)

我怎么认为它可以修复:我认为你需要用户作为第二个参数,然后做"为用户[朋友] ["朋友"]"而不是"为朋友["朋友"]的foaf

Ali*_*lik 3

是的,您在书中发现了一段不正确的代码。

函数的实现friends_of_friend_ids_bad应该是这样的:

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"]]
Run Code Online (Sandbox Code Playgroud)

user["friends"]是一个整数列表,因此friend是一个整数并且friend["friends"]会引发TypeError异常


UPD

看来,书中的问题不是关于friends_of_friend_ids_bad函数,而是关于填充friends列表。

代替

for i, j in friendships:
    users[i]["friends"].append(j)
    users[j]["friends"].append(i)
Run Code Online (Sandbox Code Playgroud)

for i, j in friendships:
    users[i]["friends"].append(users[j])
    users[j]["friends"].append(users[i])
Run Code Online (Sandbox Code Playgroud)

然后friends_of_friend_ids_bad并将friends_of_friend_ids按预期工作。