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

Popular posts from this blog

Java 3D LWJGL collision -

spring - SubProtocolWebSocketHandler - No handlers -

methods - python can't use function in submodule -