g = { 
      "A" : [ ["B", 5], ["G", 2] ],
      "B" : [ ["A", 5], ["C", 3] ],
      "C" : [ ["B", 3], ["H", 9] ],
      "D" : [ ["F", 4] ],
      "E" : [ ["G", 1], ["H", 7] ],
      "F" : [ ["D", 4] ],
      "G" : [ ["A", 2], ["E", 1], ["H", 2] ],
      "H" : [ ["C", 9], ["E", 7], ["G", 2] ]
     }

###

def printNodes(g):
    for node in g:
        print(node)

printNodes(g)

###

def getNeighbors(g, node):
    result = []
    for pair in g[node]:
        neighborValue = pair[0]
        edgeWeight = pair[1]
        result.append(neighborValue)
    return result

print(getNeighbors(g, "G"))

###

def printEdges(g):
    for startNode in g:
        for pair in g[startNode]:
            endNode = pair[0]
            print(startNode + "-" + endNode)

printEdges(g)

###

def getEdgeWeight(g, start, end):
    for pair in g[start]:
        if pair[0] == end:
            return pair[1]
    return None

print(getEdgeWeight(g, "H", "E"))

###

friends = {
      "Jon"     : [ ["Arya", None], ["Tyrion", None] ],
      "Tyrion"  : [ ["Jaime", None], ["Pod", None], ["Jon", None] ],
      "Arya"    : [ ["Jon", None] ],
      "Jaime"   : [ ["Tyrion", None], ["Brienne", None] ],
      "Brienne" : [ ["Jaime", None], ["Pod", None] ],
      "Pod"     : [ ["Tyrion", None], ["Brienne", None], ["Jaime", None] ],
      "Ramsay"  : [ ]
    }

def findPopularPerson(g):
    mostPopular = None
    mostPopularCount = -1
    for person in g:
        numFriends = len(g[person])
        if numFriends > mostPopularCount:
            mostPopular = [ person ]
            mostPopularCount = numFriends
        elif numFriends == mostPopularCount: # handle tie cases
            mostPopular.append(person)
    return mostPopular

print(findPopularPerson(friends))

###

def makeInviteList(g, name):
    invite = []
    
    for pair in g[name]:
        invite.append(pair[0])
    
    for friend in g[name]:
        for newFriend in g[friend[0]]:
            newName = newFriend[0]
            if (newName not in invite):
                invite.append(newName)
    
    if name in invite:
        invite.remove(name)
        
    return invite

print(makeInviteList(friends, "Tyrion"))

###

def friendsInCommon(g, p1, p2):
    result = []
    for pair1 in g[p1]:
        for pair2 in g[p2]:
            if pair1[0] == pair2[0]:
                result.append(pair1[0])
    
    return result
    
print(friendsInCommon(friends, "Jon", "Jaime")) # should return [ "Tyrion" ]