'''
Created on Oct 26, 2011

@author: rodger
'''

def processFile(file):
    '''
    The parameter file is the name of a file with one or more names
    on a line. Each name is two words separated by a blank.
    Multiple names on a line are separated by a colon
    Return a list of names
    '''
    nameList = []
    for line in file:
        listNames = line.strip().split(':')
        [nameList.append(nm.split()) for nm in listNames]
    return nameList

def processFiles(numberFiles):
    ''' Given the number of files to process, assume all have
    the name "namesNUM.txt". Process all those files
    '''
    nameList = []
    for number in range(1,numberFiles+1):
        filename = "../data/names" +  str(number) + ".txt"
        #TODO:
        file = open(filename)
        moreNames = processFile(file)
        # This next line does not work, cannot append a list to a list this way
        #nameList.append(moreNames)
        # this works:
        nameList += moreNames
        # this works
#        for name in moreNames:
#            nameList.append(name)
        file.close()
    return nameList
        
        
        
    return nameList

def uniqueFirstNames(data):
    '''
    The parameter data is a list of lists where each list is two 
    strings representing the first and last name of a person. 
    Return a list of the unique first names of all the people.
    '''
    uniqueNames = set([])
    #TODO:
    for item in data:   # item is a list with first and last names
        uniqueNames.add(item[0])
    return list(uniqueNames)
    
    
    
    
    
    
def uniqueLastNames(data, firstName):
    '''
    The parameter data is a list of lists where each list is two  
    strings representing the first and last name of a person. 
    The string parameter firstname is the first name of a 
    person (one word).
    Return a list of the last names of all the people 
    from data with this 
    first name. Assume each person in data is unique.
    '''
    return [item[1]  for item in data   if item[0] == firstName]  #TODO; Replace me


    
 
    
    
def correspondingLastNames(data, firstNames): 
    '''
    The parameter data is a list of lists where each list is two  
    strings representing the first and last name of a person. 
    The parameter firstNames is a list of the unique first 
    names from data.
    return a list of lists of last names such that the nth list 
    of last names corresponds to the nth first name in firstNames.
    '''
    lastNames = []
    #TODO:
    for name in firstNames:
        lastNames.append(uniqueLastNames(data,name))
    
    return lastNames
    
    
    
    
    
    return lastNames
    
def printFirstWithLasts(firstNames, lastNames):
    print "Print Unique First Names with all Last Names"      
    #TODO:
    for (index,first) in enumerate(firstNames):
        print first + ":" + " ".join(lastNames[index])
    
    
    


def main():

   #fileWithNames = open("../data/names1.txt")
   # namelist = processFile(fileWithNames)  

    # for last problem: 
    namelist = processFiles(3)
    
    print "list of all names: ", namelist 
    firstNames = uniqueFirstNames(namelist)
    print "unique first names", firstNames
    
    print "last names for Susan", uniqueLastNames(namelist, "Susan")
    print "last names for Eric", uniqueLastNames(namelist, "Eric")
    
    lastNames = correspondingLastNames(namelist, firstNames)
    print "print list of all lastnames that correspond", lastNames
    
    print "print in nice format"
    printFirstWithLasts(firstNames, lastNames)
    
    
    maxnum = max(len(item) for item in lastNames)
    print maxnum
    lastIndex = [index for (index, v) in enumerate(lastNames) if len(v) == maxnum]
    print "first name with most last names is:"
    #TODO:
    print firstNames[lastIndex[0]]
    

if __name__ == "__main__":
    main() 
        
     
