我正在阅读新书"从头开始数据科学: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
是的,您在书中发现了一段不正确的代码。
函数的实现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按预期工作。