CS 101 Fall 25 Exam 2: Sec01 and Sec02 =================================================================== PROBLEM 1: SECTION 01 =================================================================== OUTPUT: [0, 4, 5, 6, 7, 8, 9] #---------------------------- OUTPUT: [4, 5] #---------------------------- OUTPUT: [7, 8] [0, 5, 6, 7, 8, 9] [5, 6] #---------------------------- OUTPUT: ['A', 'A', 'G', 'H'] [2, 6, 0] # ANY ORDER [0, 2, 5, 6] ['G', 'G', 'H', 'R'] =================================================================== PROBLEM 1: SECTION 02 =================================================================== OUTPUT: [0, 1, 2, 3, 5, 6, 9] #---------------------------- OUTPUT: [3, 4, 5] #---------------------------- OUTPUT: [3, 7] [1, 2, 3, 4, 6, 7] [2, 6] #---------------------------- OUTPUT: ['B', 'H', 'X', 'Z'] [2, 9] # ANY ORDER [2, 3, 4, 5, 9] ['B', 'H', 'T', 'V', 'X'] ====================== PROBLEM 2 PART A ====================== result = [ word for word in lst if word.count(word[-1]) > 1 ] # uses count on word ... word[:-1].count(word[-1]) > 0 ] # uses count on substr ... word[-1] in word[:-1] ] # uses 'in' ... word.find(word[-1]) < len(word)-1 ] # uses find on word ... word[:-1].find(word[-1]) > -1 ] # uses find on substr ... word.index(word[-1]) < len(word)-1 ] # uses index on word (can't be substr!) ====================== PROBLEM 2 PART B ====================== result = [ 101+x for x in lst if str(x)[-1] == str(x)[-2] ] # uses str to get digits OR result = [ 101+x for x in lst if x % 10 == (x//10) % 10 ] # solves for digits with mod OR result = [ 101+x for x in lst if (x % 100) % 11 == 0 ] # clever mod ====================== PROBLEM 2 PART C ====================== result = [ x[len(x)//2:] for x in lst if len(x)%2 == 0 ] OR result = [ x[len(x)//2:] for x in lst if len(x)/2 == len(x)//2 ] ====================== PROBLEM 3 PART A ====================== result = [] for word in phrase.split(): last = word[-1] first = word[0] new_word = word[:-1] + first + last result.append( (last, new_word) ) OR result = [ (word[-1], word[:-1] + word[0] + word[-1]) for word in phrase.split() ] ====================== PROBLEM 3 PART B ====================== maxMem = -1 for i in range(len(memory)): if prices[i] <= 1500 and memory[i] > maxMem: maxMem = memory[i] result = maxMem # or use result directly in place of maxMem OR result = max(memory[i] for i in range(len(memory)) if prices[i] <= 1500) # OR a combination of these ideas (compute max in each iteration vs. use max() func at end) ====================== PROBLEM 3 PART C ====================== result = sorted(set(phrase2.split()) - set(phrase1.split())) OR result = sorted(set(phrase2.split()).difference(set(phrase1.split()))) OR result = [] for word in phrase2.split(): if word not in phrase1.split(): result.append(word) ======================== PROBLEM 4 PART A ======================== maxMem = -1 def topFaves(datalist, movie): count = 0 for row in datalist: if movie in row[3][:2]: # alternative: if movie == row[3][0] or movie == row[3][1]: count += 1 return count OR def topFaves(datalist, movie): count = 0 for _, _, _, faves in datalist: if movie in faves: # necessary, otherwise .index() raises exception! idx = faves.index(movie) if idx == 0 or idx == 1: count += 1 return count ======================== PROBLEM 4 PART B ======================== def likelyFunds(datalist, chance): funds = [] for row in datalist: if row[2] >= chance: funds.append(row[1]) return sorted(funds) OR def likelyFunds(datalist, chance): funds = [] for _, donation, prob, _ in datalist: if prob >= chance: funds.append(donation) return sorted(funds) OR def likelyFunds(datalist, chance): return sorted( [row[1] for row in datalist if row[2] >= chance] ) ======================== PROBLEM 4 PART C ======================== def movieLovers(datalist): netids = [] maxUniques = 0 for i in range(len(datalist)): others = [] # get movies favorited by anyone other than student i for j in range(len(datalist)): if i != j: others += datalist[j][3] uniques = set(row[i][3]) - set(others) # get unique movies for i if len(uniques) > maxUniques: # if more than seen previously, new max netids = [datalist[i][0]] # start new list with only this student maxUniques = len(uniques) # update maxUniques elif len(uniques) == maxUniques: # student i matches current max; add to list netids.append(datalist[i][0]) return sorted(netids) def movieLovers(datalist): # start parallel lists netids = [] maxUniques = 0 for row in datalist: netid = row[0] uniques = set(row[3]) # find movies not favorited by anyone else for movie in movies: for row2 in datalist: if row1 != row2 and movie in row2[3]: uniques.remove(movie) if len(uniques) > maxUniques: maxUniques = len(uniques) netids = [] if len(uniques) == maxUniques: netids.append(netid) return sorted(netids) def movieLovers(datalist): # start parallel lists netids = [] numUniques = [] for row in datalist: netid = row[0] movies = set(row[3]) # remove movies favorited by someone else for movie in movies: for row2 in datalist: netid2 = row2[0] if netid != netid2: movies2 = set(row2[3]) movies = movies - movies2 # update parallel lists netids.append(netid) numUniques.append(len(movies)) # return student netids with max number of uniques maxUnique = max(numUniques) return sorted( [ netids[i] for i in range(len(netids)) if numUniques[i] == maxUnique] ) OR def movieLovers(datalist): # initialize list (to allow duplicates) movies = [] # compute list of all movies for row in datalist: for movie in row[3]: favesWithRepeats += row[3] # initialize parallel lists netids = [] numUniques = [] # count number of movies favorited by exactly one student (must be the current one) for row in datalist: uniques = [ movie for movie in row[3] if favesWithRepeats.count(movie) == 1 ] numUniques.append(len(uniques)) # return student netids with max number of uniques maxUniques = max(numUniques) return sorted(datalist[i][0] for i in range(len(datalist)) if numUniques[i] == maxUniques) OR def movieLovers(datalist): uniques = set() nonUniques = set() # compute set of movies uniquely favorited for row in datalist: for movie in row[3]: if movie not in nonUniques and movie not in uniques: uniques.add(movie) elif movie in uniques: uniques.remove(movie) nonuniques.add(movie) # count uniques per student numUniques = [] for row in datalist: numUnique = 0 for movie in row[3]: if movie in uniques: numUnique += 1 # return student netids with max number of uniques maxUniques = max(numUniques) return sorted(datalist[i][0] for i in range(len(datalist)) if numUniques[i] == maxUniques) ============================== PROBLEM 4 PART D ============================== def favesThese(datalist, movies): netids = [] for row in datalist: for movie in row[3]: if movie in movies: netids.append(row[0]) return sorted(netids) OR def favesThese(datalist, movies): netids = [] for row in datalist: if len(set(movies) & set(datalist[3])) > 0: # alternatively: # if set(movies) & set(datalist[3]): netids.append(row[0]) return sorted(netids) OR def favesThese(datalist, movies): return sorted(row[0] for row in datalist if set(row[3]) & set(movies) != set() ) ============================== PROBLEM 4 PART E ============================== def processFile(filename): f = open(filename) datalist = [ ] for line in f: parts = line.split(':') left = parts[0].split('-') movies = left[-1] + parts # first movie is between last hyphen, first colon netid = left[0] donation = int(left[1]) prob = float(left[2]) datalist.append( [left[0], int(left[1]), float(left[2]), movies] ) f.close() return datalist OR def processFile(filename): f = open(filename) datalist = [ ] for line in f: parts = line.split('-') # assumes no hyphens in movie titles, OK movies = parts[-1].split(':') netid = parts[0] donation = int(parts[1]) prob = float(parts[2]) datalist.append( [netid, donation, prob, movies] ) f.close() return datalist