python - friends_of_friend_ids(user) function error (trying to determine 2nd degree connections) -
the function friends_of_friend_ids(user) supposed find friends of friend. function should count user's friends following rules (see below). i'm following example in book 'data science scratch: first principles python" , there errata in 1 of previous functions. have adjust friends_of_friend_ids(user) make work again.
foaf = friend of friend
correct code (i think)
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 each tuple represents 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 each user user in users: user["friends"] = [] #go through friendships , add each 1 friends key in users i, j in friendships: users[i]["friends"].append(j) users[j]["friends"].append(i) #friends of friend projects def friends_of_friend_ids_bad(user): return [users[foaf]["id"] friend in user["friends"] foaf in users[friend]["friends"]] def not_the_same(user, other_user): return user["id"] != other_user["id"] def not_friends(user, other_user): return all(not_the_same(friend, other_user) friend in user["friends"])
function can't figure out
def friends_of_friend_ids(user): return counter(users[foaf]["id"] friend in user["friends"] foaf in users[friend]["friends"] if not_the_same(user, foaf) , not_friends(user, foaf)]
replace last ]
in friends_of_friend_ids()
)
, , foaf
in loop integer, not dictionary, need resolve user dictionary:
def friends_of_friend_ids(user): return counter(users[foaf]["id"] friend in user["friends"] foaf in users[friend]["friends"] if not_the_same(user, users[foaf]) , not_friends(user, users[foaf]))
you have similar error in not_friends()
; need resolve ids full user dictionaries:
def not_friends(user, other_user): return all(not_the_same(users[friend], other_user) friend in user["friends"])
the generator expression this:
counter = counter() friend in user["friends"]: foaf in users[friend]["friends"]: if not_the_same(user, users[foaf]) , not_friends(user, users[foaf]): counter[users[foaf]['id']] += 1
note how loops nest in same order listed in generator expression.
with above 2 fixes code works:
>>> user in users: ... print('user: {}'.format(user['name'])) ... print(friends_of_friend_ids(user)) ... user: ashley counter({3: 1, 4: 1}) user: ben counter({3: 1, 4: 1}) user: conrad counter({4: 2}) user: doug counter({5: 2, 0: 1, 1: 1, 6: 1}) user: evin counter({2: 2, 0: 1, 1: 1}) user: florian counter({3: 2, 6: 1}) user: gerald counter({3: 1, 5: 1})
Comments
Post a Comment