users = [ { "id": 0, "name": "Hero" }, { "id": 1, "name": "Dunn" }, { "id": 2, "name": "Sue" }, { "id": 3, "name": "Chi" }, { "id": 4, "name": "Thor" }, { "id": 5, "name": "Clive" }, { "id": 6, "name": "Hicks" }, { "id": 7, "name": "Devin" }, { "id": 8, "name": "Kate" }, { "id": 9, "name": "Klein" } ] friendships = [ (0,1), (0,2), (1,2), (1,3), (2,3), (3,4), (4,5), (5,6), (5,7), (6,8), (7,8), (8,9) ] for user in users: user["friends"] = [] for i,j in friendships: #this works because users[i] is the user whose id is i users[i]["friends"].append(users[j]) #add i as a friend of j users[j]["friends"].append(users[i]) #add j as a friend of i def number_of_friends(user): """how many friends does _user_ have?""" return len(user["friends"]) total_connections = sum(number_of_friends(user) for user in users) print(total_connections) #from __future__ import division #num_users = len(users) #avg_connections = total_connections / num_users #create a list (user_id, number_of_friends) num_friends_by_id = [(user["id"], number_of_friends(user)) for user in users] sorted_by_num_friends = sorted(num_friends_by_id, key=lambda (user_id, num_friends): num_friends, reverse=True) def friends_of_friend_ids_bad(user): return [foaf["id"] for friend in user["friends"] for foaf in friend["friends"]]